2016-12-08 3 views
0

Итак, у меня есть эта структура данных ниже; это в основном календарь событий, установленных для учреждения.Как выбрать часть массива поддокументов в mongodb?

{ 
    "_id" : ObjectId("58485e8b630c3106ba4af558"), 
    "institutionId" : "6z66TRkvmEpCkLsKH", 
    "events" : [ 
     { 
      "name" : "Christmas Day", 
      "date" : ISODate("2016-12-25T21:21:11.874Z"), 
      "holiday" : true 
     }, 
     { 
      "name" : "Independence Day", 
      "date" : ISODate("2016-08-04T21:21:11.874Z"), 
      "holiday" : true 
     }, 
     { 
      "name" : "My Birthday", 
      "date" : ISODate("2016-06-20T21:21:11.874Z"), 
      "holiday" : false 
     } 
    ], 
    "createdAt" : ISODate("2016-12-07T19:10:03.351Z") 
} 

Как получить массив только праздников? (Где праздник = истина)

[ 
    { 
     "name" : "Christmas Day", 
     "date" : ISODate("2016-12-25T21:21:11.874Z"), 
     "holiday" : true 
    }, 
    { 
     "name" : "Independence Day", 
     "date" : ISODate("2016-08-04T21:21:11.874Z"), 
     "holiday" : true 
    } 
] 

Является ли это даже правильный подход при хранении событий календаря для учреждения или я должен иметь одно событие в документе?

Спасибо!

+0

см это. это похоже - http://stackoverflow.com/questions/40896625/retrieve-field-value-from-array-of-sub-document/40897012?noredirect=1#comment69008123_40897012 –

ответ

1

Вы можете сделать это с помощью агрегации довольно легко, также может быть способ сделать это с помощью $ elemMatch в вашей проекции.

db.collection.aggregate([ 
    // Create a separate document for each element in your array 
    { $unwind: '$events' }, 
    // Match only on the holidays 
    { $match: { 'events.holiday': true } }, 
    // Regroup to form the array with only the matching holidays 
    { $group: { _id: null, holidays: { $addToSet: '$events' } } }, 
    // Return only the holidays array, and not the _id 
    { $project: { _id: 0, holidays: 1 } } 
]); 

Возвращает:

{ 
    "holidays" : [ 
     { 
      "name" : "Independence Day", 
      "date" : ISODate("2016-08-04T21:21:11.874Z"), 
      "holiday" : true 
     }, 
     { 
      "name" : "Christmas Day", 
      "date" : ISODate("2016-12-25T21:21:11.874Z"), 
      "holiday" : true 
     } 
    ] 
} 
+0

Спасибо, человек! Вот что мне нужно! –

+0

Если вы не знакомы с понятиями агрегации, вы должны попробовать запустить ту же самую команду с помощью только разматывания, затем разматывать и сопоставлять, затем разматывать + матч + группу, чтобы вы могли видеть, что делает каждый этап. Это довольно круто и полезно! – dyouberg

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