使用$ match plus aggregate赢得了正确的平均值($ avg)

时间:2017-03-24 22:54:11

标签: node.js mongodb mongoose

我使用的是mongoose,我的模型叫做Db.Property。

当我做Db.Property.find()并且我传递下方的对象时,我得到了预期的结果

{ 
    address: { "$in": [ /f/i ] },
    environments: 1,
    price: { "$gt": 3000, "$lt": 20000 },
    timestamp: { 
        "$gt": 2017-01-23T22:38:24.904Z,
        "$lt": 2017-03-24T22:38:24.906Z 
    },
    _id: { "$nin": [ "58be3e36309524218ca5eb2e" ] } 
}

请注意我添加" $ nin"不包括id的条目:)

如果那时,我这样做:

model.aggregate([ {
    $match : mongooseQuery // this is the query you see above
}, {
    $group : {
        _id : {
            environments : '$environments'
        },
        avg : {
            '$avg' : '$price'
        }
    }
}]).exec(...)

我得到的平均价格就像我明确排除的文件在结果中一样。

我做错了什么?

1 个答案:

答案 0 :(得分:1)

我一直在研究这个问题并发现它无法正常工作,因为我正在将字符串传递给$ nin:

_id: { "$nin": [ "58be3e36309524218ca5eb2e" ] } 

我改为:

var ObjectID = require('mongodb').ObjectID;

var modelObjId = new ObjectID("58be3e36309524218ca5eb2e");

_id: { "$nin": [ modelObjId ] } 

这很好,平均值是正确的

希望它可以帮助遇到此麻烦的其他人

不对字符串进行硬编码,这里的代码只是一个例子:)