Как применить $ arrayToObject к выводу массива по $ pu sh при агрегации mongodb - PullRequest
2 голосов
/ 20 февраля 2020

Приведенный ниже код (с двумя закомментированными строками)

    myComments.aggregate(
        { $sort: { createdAt: -1 } },
        { $match: query },
        { $group: {
            _id: {
                activity: "$activity",
                writer: "$writer"
            },
            summary: {
                // $arrayToObject: {
                    $push: {
                        "k": "$userID",
                        "v": "$commentText",
                    }
                // }
            },
        } },
        { $project: { _id: 0 } },
        ( err, data ) => {
            console.log( JSON.stringify( data || [] ) );
        }
    )

создает «сводные» массивы, как и ожидалось:

    [ {"summary":[ {"k":183044,"v":"adf"}, {"k":184817,"v":"be"}, {"k":187252,"v":"c"} ]},
      {"summary":[ {"k":183044,"v":"146"}, {"k":184817,"v":"25"}, {"k":187252,"v":"3"} ]} ]

Однако, когда я удаляю комментарии и разрешаю $arrayToObject для работы с этими массивами вывод data не определен.

Я неправильно использую одну или обе эти команды? Не правильно ли их так вкладывать?

1 Ответ

0 голосов
/ 20 февраля 2020

В $group, когда каждый документ повторяется, соответствующий ниже объект будет помещен в поле summary, поэтому в конце группового этапа summary будет массивом объектов.

{
    "k": "$userID",
    "v": "$commentText"
}

Кроме того, вы не можете применить $arrayToObject к сводке, потому что ваши ключи ( k ) не являются строками. Поэтому, если $ userID не является строкой, вам нужно преобразовать ее в строку на групповом этапе. Попробуйте как показано ниже:

   myComments.aggregate(
    { $sort: { createdAt: -1 } },
    { $match: query },
    {
        $group: {
            _id: {
                activity: "$activity",
                writer: "$writer"
            },
            summary: {
                $push: {
                    "k": { $toString: "$userID" },
                    "v": "$commentText",
                }
            },
        }
    },
    {
        $project: {
            _id: 0,
            summary: {
                $arrayToObject: "$summary"
            }
        }
    },
    (err, data) => {
        console.log(JSON.stringify(data || []));
    }
)
...