Mongoose: получить размер массива объектов с агрегатом - PullRequest
0 голосов
/ 01 сентября 2018

В моей коллекции есть документ:

{
"_id" : ObjectId("5b8aaaebf57de10e080c9151"),
"user_email" : "temp@temp.com",
"platforms_budget" : [ 
    {
        "_id" : ObjectId("5b8aaaebf57de10e080c9154"),
        "platform_id" : "f_01",
        "platform_name" : "Facebook"
    }, 
    {
        "_id" : ObjectId("5b8aaaebf57de10e080c9153"),
        "platform_id" : "i_01",
        "platform_name" : "Instagram"
    }, 
    {
        "_id" : ObjectId("5b8aaaebf57de10e080c9152"),
        "platform_id" : "f_02",
        "platform_name" : "Facebook_Adds"

    }
],
"__v" : 0

}

Я хочу найти конкретного пользователя с помощью "user_email" и получить длину соответствующего массива "platform_budget". Который в этом случае предполагает длину = 3.

Моя функция такова:

var BudgetSchema = require('../models/Budget');

  router.post('/temp', async function (req, res) {
  var length = await BudgetSchema.aggregate(
    [{ $match: { user_email: "test@test.com" } }, { $unwind: "$platforms_budget" },
    { $project: { "platforms_budget.count": { $size: '$platforms_budget' } } }])

  console.log(length);
})

Когда я пытаюсь использовать console.log (length), я получаю пустой массив.

Я видел другие ответы на stackoverflow, такие как этот , но я все еще не могу понять, что я делаю неправильно или как извлечь размер из ответа.

Как мне получить размер массива "platform_budget"? Спасибо.

1 Ответ

0 голосов
/ 01 сентября 2018

Если предположить, что ../models/Budget экспортирует Модель , Model # aggregate (Массив, Функция) ожидает конвейер с агрегациями в виде массива и необязательной функцией обратного вызова, которая передается ошибка (если есть) и результат (если есть).

.aggregate([...], function(error, resource) {
    // do what you want here
});

Или то, что вы также можете сделать, это использовать сам объект Aggregate и вызвать .exec(Function) для него, где функция также является обратным вызовом.

.aggregate([...]).exec(function(error, resource) {
    // do what you want here
});

Лично я все еще немного запутался по поводу документации из .aggregate(Array, Function).

Если обратный вызов пройден, агрегат выполняется и возвращается Обещание. Если обратный вызов не пройден, возвращается сам агрегат.

Похоже, что если обратный вызов пройден, обещание все еще возвращается, но я не смог найти никаких доказательств того, что .aggregate(Array, Function) вернул обещание на GitHub вообще .

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