MongoDB совокупные вложенные значения - PullRequest
0 голосов
/ 27 февраля 2019

В коллекции MongoDB есть данные, вложенные в массив absence.

{
"_id" : ObjectId("5c6c62f3d0e85e6ae3a8c842"),
"absence" : [
    {
        "date" : ISODate("2017-05-10T17:00:00.000-07:00"),
        "code" : "E",
        "type" : "E",
        "isPartial" : false
    },
    {
        "date" : ISODate("2018-02-24T16:00:00.000-08:00"),
        "code" : "W",
        "type" : "E",
        "isPartial" : false
    },
    {
        "date" : ISODate("2018-02-23T16:00:00.000-08:00"),
        "code" : "E",
        "type" : "E",
        "isPartial" : false
    },
    {
        "date" : ISODate("2018-02-21T16:00:00.000-08:00"),
        "code" : "U",
        "type" : "U",
        "isPartial" : false
    },
    {
        "date" : ISODate("2018-02-20T16:00:00.000-08:00"),
        "code" : "R",
        "type" : "E",
        "isPartial" : false
    }
]
}

Я бы хотел агрегировать по absence.type, чтобы получить счетчик каждого типа и общее количествоabsence дети.Результаты могут выглядеть следующим образом:

{
    "_id" : ObjectId("5c6c62f3d0e85e6ae3a8c842"),
    "U" : 1,
    "E" : 4,
    "total" : 5
}

Здесь опубликовано несколько похожих вопросов, но мне еще предстоит успешно адаптировать ответы к моей схеме.Любая помощь очень ценится.

Кроме того, есть ли инструменты моделирования GUI, которые помогут в построении запросов MongoDB?Переход от запросов к СУБД к конвейеру агрегации Монго был довольно сложным.

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Если вы знаете все возможные значения «отсутствие.типа», то $ фильтрует массив по значению и вычисляет размер $ отфильтрованного массива.Это не сработает, если вы не знаете все возможные значения в "отсутствие.типа".

db.col.aggregate([

    { $project: { U: { $size: { $filter: { input: "$absence", as: "a", cond: { $eq: [ "$$a.type", "U"]}  }}}, 
                    E: { $size: { $filter: { input: "$absence", as: "a", cond: { $eq: [ "$$a.type", "E"]}  }}} }},
    { $project: { total: { $add: [ "$U", "$E" ]}, U: 1, E: 1}},

])
0 голосов
/ 27 февраля 2019

Вы можете использовать агрегацию ниже:

db.col.aggregate([
    {  
        $unwind: "$absence" 
    },
    {
        $group: {
            _id: { _id: "$_id", type: "$absence.type" },
            count: { $sum: 1 }
        }
    },
    {
        $group: {
            _id: "$_id._id",
            types: { $push: { k: "$_id.type", v: "$count" } },
            total: { $sum: "$count" }
        }
    },
    {
        $replaceRoot: {
            newRoot: {
                $mergeObjects: [ "$$ROOT", { $arrayToObject: "$types" } ]
            }
        }
    },
    {
        $project: {
            types: 0
        }
    }
])

$ unwind позволяет получить один документ на absence.Затем вам нужно удвоить $ group , первый для подсчета на type и _id и второй для агрегирования данных за _id.При наличии одного документа на _id вам просто нужно $ replaceRoot с $ mergeObjects , чтобы продвигать ваши динамически созданные ключи и значения (с помощью $ arrayToObject ) на корневой уровень.

вывод:

{ "_id" : ObjectId("5c6c62f3d0e85e6ae3a8c842"), "total" : 5, "U" : 1, "E" : 4 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...