получить сумму условно с mongodb - PullRequest
0 голосов
/ 08 мая 2018

Мне нужно получить сумму продаж, только с idCategory, вы понимаете? У меня есть эти 3 схемы в mongondb

category = [{"id":1,"name":"cat1"}, {"id":2,"name":"cat2"}]
product  = [{"id":1,"name":"product1", "catId":1}, {"id":2,"name":"product2", "catId":2}]
sells    = [{"id":1,"value":80, "productId":1, status:'active'},  {"id":2,"value":90, "productId":2, status:'Inactive'}]  

1 Ответ

0 голосов
/ 08 мая 2018

Коллекции MongoDB не являются реальными схемами, также, я предполагаю:

  • Вы интерпретируете их как массивы (хотя это не так), поэтому вы имеете в виду, что в каждой из ваших коллекций есть 2 документа.

  • Требуется сумма продаж, сгруппированная по категории продукта.

Если это так, то вам нужен агрегат MongoDB, который вы будете запускать в своей коллекции "продаж", "объединить" с коллекцией "product" и сгруппировать по идентификатору категории.

Базовая совокупность для этого будет выглядеть следующим образом:

sells.aggregate([
    {
        $lookup: {
            from: "product",
            localField: "productId",
            foreignField: "id",
            as: "ProductData"
        }
    },
    {
        $unwind: "$ProductData"
    },
    {
        $group: {
            _id: "$ProductData.catId",
            total: { $sum: "$value" }
        }
    }
]);

Если вы также хотите получить имя категории после агрегирования, все, что вам нужно сделать, это вставить еще один $ lookup в конце конвейера, соединяющегося с коллекцией категорий:

sells.aggregate([
    {
        $lookup: {
            from: "product",
            localField: "productId",
            foreignField: "id",
            as: "ProductData"
        }
    },
    {
        $unwind: "$ProductData"
    },
    {
        $group: {
            _id: "$ProductData.catId",
            total: { $sum: "$value" }
        }
    },
    {
        $lookup: {
            from: "category",
            localField: "_id",
            foreignField: "id",
            as: "CategoryData"
        }
    },
    { 
        $unwind: "$CategoryData"
    },
    {
        $project: {
            name: "$CategoryData.name",
            total: 1
        }
    }
]);

РЕДАКТИРОВАТЬ (добавление нового запроса к делу в комментарии):

db.getCollection('product').aggregate([
    {
        $lookup: {
            from: "sells",
            localField: "id",
            foreignField: "productId",
            as: "SalesData"
        }
    },
    {
        $unwind:
        {
            path: "$SalesData",
            preserveNullAndEmptyArrays: true
        }
    },
    {
        $project: {
            catId: 1,
            value: "$SalesData.value"
        }
    },
    {
        $group: {
            _id: "$catId",
            total: { $sum: "$value" }
        }
    },
    {
        $lookup: {
            from: "category",
            localField: "_id",
            foreignField: "id",
            as: "CategoryData"
        }
    },
    { 
        $unwind: "$CategoryData"
    },
    {
        $project: {
            name: "$CategoryData.name",
            total: 1
        }
    }
]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...