【问题标题】:MongoDB Aggregate IssueMongoDB 聚合问题
【发布时间】:2018-04-18 12:57:09
【问题描述】:

我正在尝试使用聚合函数显示按订单订购的所有产品,ID 为“O1234”。我已经多次检查了我的代码,但我一直收到一个错误,说我遗漏了一个“}”括号,但我似乎找不到它。

以下是我为上述查询尝试过的代码:

db.order.aggregate([
    {$unwind: "$order"},
    {$unwind: "$order.product"}, 
    {$match: {"order._id": 'O1234'}}, 
    {
        $project: {
            _id:0, 
            prod_name: "$order.product.prod_name",
            prod_price: "$order.product.prod_price", 
            order_qty: "$order.product.order_qty", 
            order_total: $multiply:
            ["$order.product.prod_price", "$order.product.order_qty"]
        }
    }
]);

下面是我的订单集合代码,其中包含一系列产品:

db.order.insert(
    {
        _id: 'O1234',
        date: '2018-02-11',
        time: '09:03',
        cust_id: 'C2057',
        driver: 'Mike',
        products: [
            {   _id: 'P1234', 
                order_qty: 1,
                prod_name: 'Office Desk',
                prod_price: 50
            },
            {
                _id: 'P5678',
                order_qty: 1,
                prod_name: 'Bathroom Cabinet',
                prod_price: 30
            }
        ]
    }
);
db.order.insert(
    {
        _id: 'O5678',
        date: '2018-06-10',
        time: '07:30',
        cust_id: 'C2018',
        driver: 'Jack',
        products: [
            {
                _id: 'P1122', 
                order_qty: 5,
                prod_name: 'Outdoor Chair',
                prod_price: 65
            },
            {
                _id: 'P3344',
                order_qty: 3,
                prod_name: 'Dining Table',
                prod_price: 90
            },
            {
                _id: 'P5566',
                order_qty: 7,
                prod_name: 'Bathroom Cabinet',
                prod_price: 30
            },
        ]
    }
);
db.order.insert(
    {
        _id: 'O4321',
        date: '2018-11-07',
        time: '06:00',
        cust_id: 'C0987',
        driver: 'Jack',
        products: [
            {
                _id: 'P3344', 
                order_qty: 10,
                prod_name: 'Outdoor Chair',
                prod_price: 65
            }
        ]
    }
);
db.order.insert(
    {
        _id: 'O8765',
        date: '2017-08-19',
        time: '11:30',
        cust_id: 'C2018',
        driver: 'Mike',
        products: [
            {
                _id: 'P1234', 
                order_qty: 2,
                prod_name: 'Office Desk',
                prod_price: 50
            }
        ]
    }
);
db.order.insert(
    {
        _id: 'O2018',
        date: '2018-02-11',
        time: '20:43',
        cust_id: 'C1849',
        driver: 'Mike',
        products: [
            {
                _id: 'P1122', 
                order_qty: 10,
                prod_name: 'Outdoor Chair',
                prod_price: 65
            },
            {
                _id: 'P5678',
                order_qty: 2,
                prod_name: 'Bathroom Cabinet',
                prod_price: 30
            }
        ]
    }
);

提前致谢!

【问题讨论】:

  • 我觉得$multiply: ["$order.product.prod_price", "$order.product.order_qty"]应该在{}
  • 更清楚的是order_total: { $multiply:,你有order_total: $multiply:。所以这就是缺少大括号的地方。
  • @JitendraSoftgrid 当我尝试这样做时,我收到一条错误消息:'invalid property id'。
  • @JohnnyHK 我已经缩进了我的代码?

标签: database mongodb aggregate


【解决方案1】:

我认为乘法的语法如下所述

total: { $multiply: [ "$price", "$quantity" ] } 

更多帮助请参考以下链接 Syntax for multiply

【讨论】:

  • 我已经尝试过您的建议,但它根本没有打印出任何内容,甚至没有任何错误消息。
【解决方案2】:

其他人已经帮你解决了$multiply 中的语法错误,但更大的问题是你的$ 前缀字段名称都是错误的。您的文档没有orders 级别,产品数组名为products,而不是product

您还应该将$match 过滤器放在管道的首位,因为在展开之前过滤更有效。

db.order.aggregate([
    {$match: {"_id": 'O1234'}}, 
    {$unwind: "$products"}, 
    {
        $project: {
            _id:1, 
            prod_name: "$products.prod_name",
            prod_price: "$products.prod_price", 
            order_qty: "$products.order_qty", 
            order_total: {$multiply: ["$products.prod_price", "$products.order_qty"]}
        }
    }
]);

【讨论】:

    猜你喜欢
    • 2021-12-14
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    • 2017-04-19
    • 2021-07-03
    • 2019-10-22
    • 2019-04-15
    • 1970-01-01
    相关资源
    最近更新 更多