Преобразование значений в ключи в агрегации mongodb - PullRequest
0 голосов
/ 10 октября 2018

Поскольку MongoDB обеспечивает $group подход в агрегированном конвейере, он возвращает список документов, где _id содержит некоторое «отличное» значение группировки, а другое поле - массив документов, сгруппированных по заданному условию.

Мне нужно вернуть один документ, в котором свойства являются результатами агрегации.

Пример коллекции:

{author: "Author1", title: "Title1"}
{author: "Author2", title: "Title2"}
{author: "Author2", title: "Title3"}

Агрегация

db.getCollection('books').aggregate([ 
    {"$group": {
           _id: "$author",
           books: { $push: "$$ROOT" }
          }
    }
])

Это дает мне следующий вывод:

{_id: 'Author1', books: [{author: "Author1", title: "Title1"}]},
{_id: 'Author2', books: [{author: "Author2", title: "Title2"}, {author: "Author2", title: "Title3"}]}

Но я хотел бы получить результаты как один отдельный объект, подобный этому:

{
  Author1: [
    {author: "Author1", title: "Title1"}
  ],
  Author2: [ 
    {author: "Author2", title: "Title2"},
    {author: "Author2", title: "Title3"}
  ]
}

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

Если кто-то сталкивался с такими запросами, пожалуйста, помогите с этим или дайте некоторые подсказкикак это решить.Заранее спасибо.

1 Ответ

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

Вы можете попробовать ниже агрегации

db.getCollection('books').aggregate([ 
  { "$group": {
    "_id": "$author",
    "books": { "$push": "$$ROOT" }
  }},
  { "$group": {
    "_id": null,
    "data": {
      "$push": { "k": "$_id", "v": "$books" }
    }
  }},
  { "$replaceRoot": {
    "newRoot": { "$arrayToObject": "$data" }
  }}
])
...