mongoDB聚合:通过布尔表达式对所有组进行分组

时间:2014-03-14 22:05:51

标签: mongodb aggregation-framework

我收到了带有邮政编码的收藏品。我希望将城市名称的第一个字母中的所有记录分组,或者不是数字。我希望实现这样的目标:

            {
                    "_id" : true,
                    "n" : 1234567
            },
            {
                    "_id" : false,
                    "n" : 87543
            }

到目前为止,我已经尝试过了:

db.zips.aggregate( [
    { $project : { _id : { $substr : ["$city",0,1] } } } ,
    {$group: {_id: {$in: ['0','1','2','3','4','5','6','7','8','9']}}}
] )

但是mongo抛出错误:

Fri Mar 14 23:01:52.566 aggregate failed: { "errmsg" : "exception: invalid operator '$in'", "code" : 15999, "ok" : 0 } at src/mongo/shell/collection.js:898

我可以做什么来按布尔表达式进行分组?

1 个答案:

答案 0 :(得分:2)

比你想象的更简单:

db.zips.aggregate([
    { "$group": { 
        "_id": { "$lte": [ { $substr: ["$city", 0, 1] }, "9" ]},
        "n": { "$sum": 1 } 
    }}
])

逻辑$lte运算符对内容进行了一次性比较,即一个字符(字节),当然还有#34; 9"是小于" A"。

你能以你的方式使用$in吗?不,你不能,因此错误。它是$match运算符,因此可以在该管道阶段中使用过滤结果,而这不是您想要的。

所以你想要一个"逻辑"比较,并且在词汇上下文中应用敏感算子。无论你的情况如何,你都需要使用"逻辑" comparison operator

特殊问题的形式,选择"比较"是合乎逻辑的选择。更改为其他运算符以断言不同的逻辑比较。