Я хочу запросить документы и вернуть список объектов, представляющих все категории, с массивом объектов внутри каждого объекта категории, содержащим документы, соответствующие этой категории.
Если это поможет объяснить: база данных имеетсписок документов, представляющих новостные статьи, и мне нужно отобразить их сгруппированные по категориям во внешнем интерфейсе, поэтому мне понадобится объект для каждой категории, причем каждый объект категории содержит массив статей (в виде объектов) для отображения в разделеэта категория.
У меня есть документы следующей формы:
{
"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
}
}
.
.
Что я могу сделать, чтобы вставить массив «статей», являющихся исходными статьями, которые суммируются?