具有条件(如果/其他)的MongoDB聚合总和,或者计数价格和数量问题

时间:2019-06-13 13:40:34

标签: javascript mongodb mongoose aggregation-framework

  

问题

我正在编写一个函数,该函数可以根据请求的avg price计算value和整个quantity,例如:

async funcName (first_100) {
        let market_quantity = await auctions_db.aggregate([
            {
                $match: {
                    item: 9999,
                }
            },
            {
                $sort: {
                    price: 1
                }
            },
            //RESULT
        ]);
}
  

//结果

目前,我有以下文档:

{
    item_id: 9999,
    price: 1..Number
    quantity: 1..200
    value: price x quantity //it's not virtual field
},{
    another doc...
}

正如我上面提到的,我想要做的是进入$sum price字段,直到quantity不会达到100或100+(或其他任何数字取决于功能)论点)。

我不需要$sum的前100个文档(按price升序排序,在这种情况下,我会使用.limit

很明显,我有两种方法可以这样做。目前,我在相同条件下使用collection.find({condition}).cursor(),并在单独的for loop中遍历doc,但是我知道(实际上是一位朋友告诉我) MongoDB 可以做到通过aggregate(如果/其他)块通过$cond阶段进行相同操作。

实际上,我认为在这种情况下,$operator之后的下一个//Result应该是$group阶段,

            {
                $group: {
                    _id: "$lastModified",
                    quantity: {$sum: {$cond: if/else }" $quantity"},
                    if (below 100) {$sum: "$value" }
                }
            }

但是我不知道该怎么做。那么有人可以给我提供一个例子吗? 还是aggregate阶段和.find({}).cursor和手动迭代之间没有区别?

1 个答案:

答案 0 :(得分:0)

实际上,我通过find({query}).cursor()语法解决了自己的问题,并推送到类似以下的数组:

        let market_quantity = await auctions_db.find({query}).cursor();
        for (let order = await market_quantity.next(); order != null; order = await market_quantity.next()) {
            if (quantity < arg_quantity) {
                quantity += order.quantity;
                price_array.push(order.price);
                value += order.buyout;
            } else {
                break;
            }
        }