2015-02-23 6 views
2

Если у меня есть документ, как это:найти поддокумент по идентификатору внутри поля массива вложенного объекта

{ 
    "_id": ObjectId("54e6774a73a7edfefdb9e2bc"), 
    "information":"", 
    "__v":0, 
    "goalieRoster":{ 
     "locked":[ 

     ], 
     "approved":[ 
     { 
      "_id": ObjectId("548d49bad972605bf2d1f55a"), // find by this 
     } 
     ], 
     "signedUp":[ 
     { 
      "_id": ObjectId("548d49bad972605bf2d1f55a"), 
     } 
     ], 
     "maxSize":2 
    }, 
    "skaterRoster":{ 
     "locked":[ 

     ], 
     "approved":[ 

     ], 
     "signedUp":[ 

     ], 
     "maxSize":26 
    }, 
    "date":{ 
     "updated":"2015-02-20T02:56:42.258Z", 
     "skate":"" 
    } 
} 

Как бы захватить весь поддокумент внутри approved по идентификатору поддокумента в? Я думаю, что я близок, поскольку следующий запрос почти делает то, что я хочу.

db.roster.find(
     { 
      "goalieRoster.approved._id": ObjectId("548d54e9576ddacc20f3a88e") 
     }, 
     { 
      "goalieRoster.approved": 1 
     } 
); 

возвращает родительский документ и чем согласующий поддокументе внутри approved массива вложенной goalieRoster как так

{ 
    "_id" : ObjectId("54e6774a73a7edfefdb9e2bc"), 
    "goalieRoster" : { 
     "approved" : [ 
      { 
       "_id" : ObjectId("548d54e9576ddacc20f3a88e"), 
      } 
     ] 
    } 
} 

Проблема в том, все, что я хочу это поддокумент внутри approved. Кроме того, можно ли опустить goalieRoster только approved и просмотреть его как в утвержденном массиве в goalieRoster, так и в skaterRoster?

Edit: В результате я искал это

{ 
    "_id" : ObjectId("548d54e9576ddacc20f3a88e"), 
} 

ответ

9

Что вы хотите, проекция с оператором $.

db.test.find({"goalieRoster.approved._id": ObjectId("548d49bad972605bf2d1f55a")}, 
    {"goalieRoster.approved.$": true} 
) 

Результат

{ 
    "_id" : "54e6774a73a7edfefdb9e2bc", 
    "goalieRoster" : { "approved" : [ { "_id" : "548d54e9576ddacc20f3a88e" } ] } 
} 
Смежные вопросы