Агрегировать вложенные документы с отсутствующими данными - PullRequest
1 голос
/ 07 мая 2020

У меня есть коллекция mongoDB с такими данными, как:

{
    "_id" : ObjectId("..."),
    "records" : [
        ISODate("2020-04-19T00:49:18.945Z"),
        {
            "_id" : ObjectId(""),
            "date" : ISODate("2020-05-07T04:49:55.643Z"),
            "text" : "someText"
        }
    ],
}

Значение в records отличается из-за обновлений версии.

Я хочу агрегировать records.text по всем документы без учета недостающих данных. Код из MongoDB: агрегирование и сглаживание поля массива

db.collection.aggregate({$unwind : "records"},
                      {$project: {_id: 1, 'text': '$records.text'}})

выдает:

path option to $unwind stage should be prefixed with a '$': records

и исправляет ошибку из этих направлений для размещения пустых полей:

db.collection.aggregate({$unwind : "records", includeEmpty: false},
                      {$project: {_id: 1, 'text': '$records.text'}})

throws

A pipeline stage specification object must contain exactly one field.

Как я могу агрегировать значения из вложенных массивов с возможно пустыми значениями?

Ответы [ 2 ]

1 голос
/ 07 мая 2020

В вашем первом запросе отсутствует символ «$», поскольку запись является значением поля, поэтому перед ним следует поставить префикс «$». Последний запрос будет:

db.collection.aggregate({$unwind : "$records"},
                      {$project: {_id: 1, 'text': '$records.text'}})

Надеюсь, это сработает для вас.

1 голос
/ 07 мая 2020

Вы можете отфильтровать пустые, используя $ exists :

db.collection.aggregate([
    { $unwind: "$records" },
    { $match: { "records.text": { $exists: true } } },
    { $project: { _id: 1, text: "$records.text" }}
    {$group: {_id: "$text", count: {$sum: 1}}},
    {$sort: {count: -1}}
])

Mon go Playground

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...