2013-03-30 6 views
2

MongoDB를 (또는 자바)의 배열로 객체 찾기 : 제품 1에 따르면이런 내가 모음 (세트)를 가지고

{ 
    "_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... 

을, 나는 특정 제품에있는 기능과 레이블을 찾을 수있다 그것의 "productFeature"배열.

내가 (예를 들어, 변수를 사용하여)을 찾기 위해 몽고 쉘에서 시도 :

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

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

을하지만이 작동하지 않습니다. 누군가가 배열로 객체를 찾는 방법을 알고 있다면 나를 도와주세요. 대단히 감사합니다.

PS : 그것은 자바에서 가장 좋은 것입니다 - 그냥 예를 들어 쿼리를 적용

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

입니다 : (.) ​​대신 화살표 MongoDB를 사용하면 매우 비슷한 일을 할 자바에서는 점, 예를 들어,

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

를 사용합니다. 나는 이것이 누군가에게 도움이되기를 바랍니다.

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

당신은 당신이에서 쿼리 할 필드에 문서 구조에서 "경로"를 제공해야 문서 루트 이 경우 경로는 'productFeature'-> 'id'입니다. 여기에 내 자신의 질문에 대한 내 대답은

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")); 
}