2016-03-06 3 views
0

Мой объект:Mongoose найти и вернуть только часть документа

[ 
    { 
     "_id": "568ad3db59b494d4284ac191", 
     "name": "Test", 
     "groups": [ 
     { 
      "number": "1", 
      "name": "GroupTest", 
      "_id": "568ad3db59b494d4284ac19b", 
      "orders": [ 
      { 
       "date": "2016-03-06T13:07:40.990Z", 
       "_id": "56dc2b9c1d47772806e4f0f4", 
       "readings": [ 
       { 
        "readingid": "568ad3db59b494d4284ac1a5", 
        "_id": "56dc2b9c1d47772806e4f0fc" 
       }, 
       { 
        "readingid": "568ad3db59b494d4284ac1a4", 
        "_id": "56dc2b9c1d47772806e4f0fb" 
       }, 
       { 
        "readingid": "568ad3db59b494d4284ac1a3", 
        "_id": "56dc2b9c1d47772806e4f0fa" 
       }, 
       { 
        "readingid": "568ad3db59b494d4284ac1a2", 
        "_id": "56dc2b9c1d47772806e4f0f9" 
       }, 
       { 
        "readingid": "56d48ae1a0f6e04413fc8b3e", 
        "_id": "56dc2b9c1d47772806e4f0f8" 
       }, 
       { 
        "readingid": "56d48ae1a0f6e04413fc8b3f", 
        "_id": "56dc2b9c1d47772806e4f0f7" 
       }, 
       { 
        "readingid": "568ad3db59b494d4284ac1a1", 
        "_id": "56dc2b9c1d47772806e4f0f6" 
       }, 
       { 
        "readingid": "568ad3db59b494d4284ac1a0", 
        "_id": "56dc2b9c1d47772806e4f0f5" 
       } 
       ] 
      }, 
      {....} 
      ] 
     }, 
     {....} 
     ] 
    }, 
    {.....} 
] 

мне нужно Finde заказ с _id: «56dc2b9c1d47772806e4f0f4» в группе с _id: «568ad3db59b494d4284ac19b» внутри объекта клиента с _id: "568ad3db59b494d4284ac191", и я хочу только получить подобъект заказа, а не весь объект клиента.

Я пытался что-то вроде:

Client.find(
{_id: "568ad3db59b494d4284ac191", groups._id: "568ad3db59b494d4284ac19b", groups.orders._id:"56dc2b9c1d47772806e4f0f4"}, 
{groups.orders:{$elemMatch:{_id: "56dc2b9c1d47772806e4f0f4"}}}) 

Antoher попытка не увенчалась успехом:

Client.find(
{_id: req.company, groups:ObjectId(req.params.groupId)}, 
{"groups.orders":{$elemMatch:{_id: ObjectId(req.params.orderId)}}}, function(e,company){ 
    if(!e) { 
     console.log(company); 
    } 
}); 

ответ

0

Монго является «документ-ориентированной» базы данных, поэтому все нормальные операции и запросы, которые он обеспечивает возвращение «документы «а не« части документов », поэтому с обычными методами запросов нет способа получить только подобъект.

Вы можете использовать структуру агрегации mongo для достижения желаемого (https://docs.mongodb.org/manual/reference/operator/aggregation/), используя два $unwind: https://docs.mongodb.org/manual/reference/operator/aggregation/unwind/. Это даст документ для каждого order, а затем используйте $match, чтобы отфильтровать те, которые вам нужны.

Возможно, было бы лучше переосмыслить вашу модель данных. Если вам действительно нужно запрашивать и получать заказы только без получения всего объекта клиента, лучше хранить заказы в своей коллекции и использовать ссылки на группы и клиенты.

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