$ group, чтобы получить все связанные данные в массиве - PullRequest
0 голосов
/ 11 декабря 2018

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

Если это поможет объяснить: база данных имеетсписок документов, представляющих новостные статьи, и мне нужно отобразить их сгруппированные по категориям во внешнем интерфейсе, поэтому мне понадобится объект для каждой категории, причем каждый объект категории содержит массив статей (в виде объектов) для отображения в разделеэта категория.

У меня есть документы следующей формы:

{ 
    "date" : ISODate("2018-06-25T00:00:00.000+0000"), 
    "detail" : {
        "category" : "world", 
        "title" : "stuff is happening", 
        "content" : "lorem ipsum dolor"
    } 
}
{ 
    "date" : ISODate("2018-03-08T00:00:00.000+0000"), 
    "detail" : {
        "category" : "national", 
        "title" : "more stuff is happening", 
        "content" : "sit amet"
    } 
}
{ 
    "date" : ISODate("2018-02-02T00:00:00.000+0000"), 
    "detail" : {
        "category" : "local", 
        "title" : "local stuff is happening", 
        "content" : "not much happening locally"
    }
}

... и я бы хотел, чтобы мой результат выглядел примерно так:

{  _id: "world",
   count: 3,
   "articles" : {[
       {
       "date" : ISODate("2018-06-25T00:00:00.000+0000"), 
       "detail" : {
           "category" : "world", 
           "title" : "stuff is happening", 
           "content" : "lorem ipsum dolor"
       },
       {
       "date" : ISODate("2018-06-25T00:00:00.000+0000"), 
       "detail" : {
           "category" : "world", 
           "title" : "stuff is happening #2", 
           "content" : "lorem ipsum dolor"
       },
       {
       "date" : ISODate("2018-06-25T00:00:00.000+0000"), 
       "detail" : {
           "category" : "world", 
           "title" : "stuff is happening #3", 
           "content" : "lorem ipsum dolor"
       }
    ]}
}
{ _id: "national",
   count: 1,
   "articles" : {[
     {
       "date" : ISODate("2018-03-08T00:00:00.000+0000"), 
       "detail" : {
           "category" : "national", 
           "title" : "more stuff is happening", 
           "content" : "sit amet"
       } 
     }
}

...и так далее.Пока что у меня есть этот запрос:

db.news_feed.aggregate([
{ $match: {} },
{ $group: {_id:'$detail.category', count: { $sum:1 } } },
{ $addFields: {
                    "article": "$$ROOT"
                }
} 
])

Это дает мне суммарный счетчик каждой категории, но, очевидно, $$ ROOT вставляет результат после $ group, а не в исходный документ (ы):

{ 
    "_id" : "world", 
    "count" : 3.0, 
    "articles" : {
        "_id" : "world", 
        "count" : 3.0
    }
}
{ 
    "_id" : "national", 
    "count" : 1.0, 
    "brief" : {
        "_id" : "national", 
        "count" : 1.0
    }
}
{ 
    "_id" : "local", 
    "count" : 5.0, 
    "brief" : {
        "_id" : "local", 
        "count" : 5.0
    }
}
.
.

Что я могу сделать, чтобы вставить массив «статей», являющихся исходными статьями, которые суммируются?

1 Ответ

0 голосов
/ 11 декабря 2018

Вам необходимо использовать $push аккумулятор с $group ступень

db.news_feed.aggregate([
  { "$group": {
    "_id": "$detail.category",
    "articles": { "$push": "$$ROOT" },
    "count": { "$sum": 1 }
  }}
])
...