2013-03-30 2 views
2

У меня есть коллекция (набор данных), как это:Найти объекты по массиву в MongoDB (или Java)

{ 
    "_id" : ObjectId("515611c1c6e3718ee42a5655"), 
    "id": "Product1", 
    "type": "ProductType4" 
    "productFeature": [ 
    { 
     "id": "ProductFeature1" 
    }, 
    { 
     "id": "ProductFeature2" 
    }, 
    { 
     "id": "ProductFeature3" 
    } 
    ] 
    "productPropertyNumeric": 25 
},  
... and more product objects... 

{ 
    "_id" : ObjectId("515611c1c6e3718ee42a5666"), 
    "id": "ProductFeature1", 
    "label": "blablabla" 
}, 
{ 
    "_id" : ObjectId("515611c1c6e3718ee42a5667"), 
    "id": "ProductFeature2", 
    "label": "blebleble" 
}, 
{ 
    "_id" : ObjectId("515611c1c6e3718ee42a5668"), 
    "id": "ProductFeature3", 
    "label": "blublublu" 
}  ... and more feature objects... 

Согласно Product1, я должен найти функции и ярлыки, что конкретный продукт имеет в его массив «productFeature».

Я попытался в Монго оболочки, чтобы найти их (с помощью переменной, например):

var aaa = db.dataset.find({ id: "Product1" }) 

db.dataset.find({ id: "aaa.productFeature.id" }) 

Но это не работает. Если кто-то знает, как найти объекты по массиву, пожалуйста, помогите мне. Большое спасибо.

PS: Было бы лучше в Java - прилагаю запрос только для примера:

BasicDBObject query = new BasicDBObject(); 

    query.put("type","ProductType4"); 
    query.put("productPropertyNumeric", new BasicDBObject("$gt", 10)); 

    DBCursor cursor = coll.find(query).sort(new BasicDBObject("label", 1)); 
    while (cursor.hasNext()){ 
     System.out.println(cursor.next().get("id")); 
} 

ответ

4

Вот мой ответ на мой собственный вопрос. Надеюсь, это кому-то поможет.

BasicDBObject query = new BasicDBObject(); 
    BasicDBObject field = new BasicDBObject(); 

    query.put("id", "Product1"); 
    field.put("id", 1); 
    field.put("productFeature", 1);  
    field.put("_id", 0); 

    DBCursor cursor = coll.find(query, field); 
    while (cursor.hasNext()) { 
     BasicDBObject result = (BasicDBObject) cursor.next(); 
     System.out.println(result); 
     ArrayList<BasicDBObject> features = (ArrayList<BasicDBObject>) result.get("productFeature"); 

     for (BasicDBObject embedded : features) { 
      String featuresId = (String) embedded.get("id"); 

      BasicDBObject query2 = new BasicDBObject(); 
      BasicDBObject field2 = new BasicDBObject(); 

      query2.put("id", featuresId); 
      field2.put("id", 1); 
      field2.put("label", 1); 
      field2.put("_id", 0); 
      DBCursor cursor2 = coll.find(query2, field2); 

      while (cursor2.hasNext()) { 
       System.out.println(cursor2.next()); 
      } 
     } 
    } 
1

Вы должны поставить «путь» в структуре документа в поле, которое вы хотите запросить на от document root. В этом случае путь «productFeature» -> 'id'. Вместо стрелки MongoDB использует точку, например,

db.dataset.find({ "productFeature.id" : "Product1" }); 

В Java вы делаете что-то очень похожее (.):

BasicDBObject query = new BasicDBObject("productFeature.id" : "Product1"); 

DBCursor cursor = coll.find(query).sort(new BasicDBObject("label", 1)); 
while (cursor.hasNext()){ 
    System.out.println(cursor.next().get("id")); 
}