在mongo聚合的`$ match`阶段可以使用`$ sum`吗?

时间:2018-07-28 12:23:48

标签: mongodb mongodb-query

我在mongodb中有一个gifts集合,里面有四个项目。如何查询数据库,以便仅获得礼物,它们的amount的总和小于或等于5500?    因此,例如db中的这四个礼物:

{
   "_id": 1,
   "amount": 3000,
}, 
{
   "_id": 2,
   "amount": 2000,
},
{
   "_id": 3,
   "amount": 1000,
},
{
   "_id": 4,
   "amount": 5000,
}

查询应仅返回前两个:

{
   "_id": 1,
   "amount": 3000,
}, 
{
   "_id": 1,
   "amount": 2000,
},

我认为我应该使用mongo 聚合?如果是这样,语法是什么?
我进行了一些谷歌搜索,我知道如何在$sum阶段使用$group,但是我不知道如何在$match阶段使用它。有可能这样做吗?

P.S:我想我应该在$sum中使用$match,我应该首先对它们进行分组吗?如果是这样,我如何告诉mongo组成一个组,该组中的总和小于或等于5500?

感谢您能提供的任何帮助。

1 个答案:

答案 0 :(得分:1)

您的方法正确。

首先将您的$sum存储在变量中,然后用$match进行过滤:

db.gifts.aggregate([
    {$match: {}}, // Initial query
    {$group: {
         _id: '$code', // Assume your gift could be grouped by a unique code
         sum: {$sum: '$amount'}, // Sum all amount per group
         items: {$push: '$$ROOT'} // Push all gift item to an array
    }},
    {$match: {sum: {$lte: 5500}}}, // Filter group where sum <= 5500
    {$unwind: '$items'}, // Unwind items array to get all match field
    {$replaceRoot: {newRoot: '$items'}} // Use this stage to get back the original items
])