我收到了带有邮政编码的收藏品。我希望将城市名称的第一个字母中的所有记录分组,或者不是数字。我希望实现这样的目标:
{
"_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
我可以做什么来按布尔表达式进行分组?
答案 0 :(得分:2)
比你想象的更简单:
db.zips.aggregate([
{ "$group": {
"_id": { "$lte": [ { $substr: ["$city", 0, 1] }, "9" ]},
"n": { "$sum": 1 }
}}
])
逻辑$lte
运算符对内容进行了一次性比较,即一个字符(字节),当然还有#34; 9"是小于" A"。
你能以你的方式使用$in
吗?不,你不能,因此错误。它是$match
运算符,因此仅可以在该管道阶段中使用过滤结果,而这不是您想要的。
所以你想要一个"逻辑"比较,并且在词汇上下文中应用敏感算子。无论你的情况如何,你都需要使用"逻辑" comparison operator
以此特殊问题的形式,选择"比较"是合乎逻辑的选择。更改为其他运算符以断言不同的逻辑比较。