Монго-запрос с условиями на вложенную структуру (коллекцию) - PullRequest
0 голосов
/ 02 октября 2018

У меня есть коллекция с nested fields, например:

student: {
name: banana,
meetings: [
{grade: AW, key1, group: A, time: ISODate("2018-09-25T14:08:00.729+0000")},
{grade: AW, key2, group: A, time: ISODate("2018-09-24T14:08:00.729+0000")},
{grade: BC, key2, group: B, time: ISODate("2018-09-25T14:08:00.729+0000")},
{grade: BC, key3, group: B, time: ISODate("2018-09-24T14:08:00.729+0000")},
{grade: BD, key4, group: D, time: ISODate("2018-09-25T14:08:00.729+0000")}
  ]
}

Хотел бы подобрать для каждого meeting, подобрать name, и его latest grade информация, если group в ['A', 'B', 'C'].Например, эту коллекцию, которую я хотел бы получить:

student: {
name: banana,
meetings: [
{grade: AW, key1, group: A, time: ISODate("2018-09-25T14:08:00.729+0000")},
{grade: BC, key2, group: B, time: ISODate("2018-09-25T14:08:00.729+0000")}
  ]
}

Кажется, что использование unwind и $group является потенциальным решением.Однако коллекция очень huge, что делает $group даже невозможным.Кто-нибудь может дать мне несколько советов по этому поводу?Спасибо.

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Вы можете использовать $filter в $project.

db.getCollection('students').aggregate([
{ 
  $project : 
  {
     'student.name' : 1,
    'student.meetings' : {
      $filter: {
        input: "$student.meetings",
        as: "item",
        cond: { $in: [ "$$item.group", ["A","B"] ]}
      }
    }
  } 
  }])

Примечание: протестировано в MongoDb GUI Robo3T

0 голосов
/ 03 октября 2018

Поскольку это метод huge collection, метод group вызовет проблему memory.Поэтому я попытался использовать следующий запрос, и с некоторыми post processing в python, чтобы получить результаты.Пожалуйста, дайте мне знать, если у вас есть лучшие предложения.Спасибо :)

db.getCollection("***").aggregate([
{$unwind: {path: '$meetings'}},
{$match: 
  {
    'time':{$gte: new ISODate("2018-10-01T00:00:00Z")} , 
    'group': {$in: ['A','B']} ,
    'meetings.time':{$gte: new ISODate("2018-10-01T00:00:00Z")}
  }
},
{$addFields: {
    "_id": "$_id",
    "grade": "$meetings.grade",
    "time": "$meetings.time"
}},
{$project: { "_id": 1, "grade": 1}}
]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...