MongoDB агрегирует $ group и $ project с групповым результатом - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть такая коллекция:

{
    "_id" : ObjectId("5b73d0eb71283a04c45737b3"),
    "rating" : 5,
    "category" : "Camera",
    "topic" : "wifi",
    "version" : 1.0,
    "date" : ISODate("2018-07-11T17:30:00.000-06:30"),
    "jobId" : ObjectId("5b73d089ec6bf63b6df38484"),
    "snippet" : "very good product",
    "sku" : "B0749MNH84",
    "cleanedUp" : true
}

Я хочу агрегировать на основе заданного массива SKU и тем.Моя попытка для того же:

db.reviews.aggregate(
[
    { $match: { sku: { $in: skus } } },
    { $match: { topic: { $in: topics } } },
    {
            $group: {
                    _id: {
                            topic: '$topic', sku : "$sku"
                        },
                      snippets: {'$addToSet': {snippet: "$snippet"}}

                }
    },
    {
            $project : {
                    _id : false, sku: "$_id.sku", snippets : "$snippets", topic : "$_id.topic"
                }
    }
]
);

Для sku B0749MNH84 и топиков ['quality', 'price'], это дает мне следующие результаты:

{
  sku : 'B0749MNH84',
  snippets: [Array],
  topic : 'quality'
},
{
  sku : 'B0749MNH84',
  snippets: [Array],
  topic : 'price'
}

Что я на самом деле хочу сделать,если возможно, это использовать сам конвейер агрегации для получения результатов в этом формате (сгруппированы по SKU):

    {
      sku : 'B0749MNH84',
      topics: 
         [
           {
                 snippets: [Array],
                 topic : 'quality'
           },
           {
                 snippets: [Array],
                 topic : 'price'
           }
         ]
},
 {
      sku : 'some other SKU',
      topics: 
         [
           {
                 snippets: [Array],
                 topic : 'topic1'
           },
           {
                 snippets: [Array],
                 topic : 'topic2'
           }
         ]
}

Конечно, я могу просмотреть результаты, чтобы получить результаты в этом формате, но яинтересно, возможно ли это сделать с помощью самого конвейера агрегации.

...