2015-10-28 2 views
1

у меня есть этот Монго структуру:Монго выбрать объект, где дочерний элемент матч

my_object { 
    "_id" : ObjectId("5630c996b707fd090c060f21"), 
    "local" : "FR-fr", 
    "ARTD" : [ 
     { 
      "id" : 0, 
      "mot" : "le", 
      "v_path" : "" 
     }, 
     { 
      "id" : 1, 
      "mot" : "la", 
      "v_path" : "" 
     } 
    ], 
    "ARTG" : [ 
     { 
      "id" : 2, 
      "mot" : "ce", 
      "v_path" : "" 
     } 
    ], 
    "SUSU" : [ ], 
    "RECS" : [ ], 
    "SUBS" : [ ], 
    "VT" : [ ], 
    "PREP" : [ ] 
} 

Я хочу, чтобы получить объект по идентификатору, например: если давание идентификатор 0, я хочу:

{ 
     "id" : 0, 
     "mot" : "le", 
     "v_path" : "" 
} 

если давание идентификатор 2, я хочу:

{ 
     "id" : 2, 
     "mot" : "ce", 
     "v_path" : "" 
} 

Итак, я хочу найти куда это объект (под ARTD или A RTG ... и т. Д.)

какая команда я могу использовать для этого в оболочке mongo?

С уважением,

ответ

0

Вы можете попробовать использовать оператор $or для запроса и $elemMatch проецировать конкретный элемент массива. Переместите курсор из метода find(), используя forEach() для доступа к результирующим документам, проверки полей и доступа к элементу массива соответствующего поля. Ниже показано это для id 1:

var id = 1, 
    query = { 
     "$or": [ 
      { "ARTD.id": id }, 
      { "ARTG.id": id } 
     ] 
    }, 
    projection = { 
     "ARTD": { 
      "$elemMatch": { "id": id } 
     }, 
     "ARTG": { 
      "$elemMatch": { "id": id } 
     } 
    }; 
db.collection.find(query, projection).forEach(function (doc){ 
    var result = {}, key; 
    ["ARTD", "ARTG"].forEach(function(key) { 
     if (doc.hasOwnProperty(key)) { 
      result = doc[key][0]; 
     } 
    }); 
    printjson(result); 
}) 

Пример вывода:

{ "id" : 1, "mot" : "la", "v_path" : "" } 
+0

Спасибо, I'ts работают отлично! – Khorwin

Смежные вопросы