Как агрегировать массив документов в MongoDB - PullRequest
0 голосов
/ 07 февраля 2020

У меня есть следующая схема:

var orderSchema = new mongoose.Schema({
    deleted: Boolean,
    clientName: String,
    clientPhone: String,
    products: [{
        name: String,
        quantity: Number,
        price: Number
    }],
    observations: String,
    date: {
        type: Date,
        default: Date.now
    },
    seller: String,
    orderNumber: Number,
    total: Number
});

И я хочу сделать агрегированный запрос, суммирующий каждый продукт, добавить quantity*price к total и вернуть мне сумму. Однако я знаю, как это сделать, только если у меня было несколько продуктов, каждый в виде документа, а затем суммировать все документы, но не это.

1 Ответ

1 голос
/ 08 февраля 2020

Вы можете сделать это с помощью $ уменьшить :

db.collection.aggregate([{
    $addFields: {
        "total": {
            $reduce: {
                input: "$products",
                initialValue: '$total',
                in: { $add: [{ $multiply: ["$$this.quantity", "$$this.price"] }, '$$value'] }
            }
        }
    }
}])

Тест: MongoDB-Playground

...