我在MongoDB中有一个用户模型如下:
{ _id: <some_id>,
name: <some_name>,
preferences: <this is an object with 1-20 key values pair>
}
我想获得所有首选项键的用户数(在首选项中有20个键的用户数)。 我该如何查询呢?
答案 0 :(得分:1)
如果您拥有最新的MongoDB 3.4,那么您可以使用$objectToArray
在聚合语句中执行此操作:
Model.aggregate([
{ "$group": {
"_id": null,
"count": {
"$sum": {
"$cond": {
"if": { "$eq": [
{ "$size": {
"$objectToArray": { "$ifNull": [ "$preferences", { } ] }
}},
20
]},
"then": 1,
"else": 0
}
}
}
}}
])
新操作符$objectToArray
将采用&#34;键/值&#34;的对象配对并将其转换为数组。所以这个:
{ "a": 1, "b": 2 }
成为这个:
[ { "k": "a", "v": 1 }, { "k": "b", "v": 2 } ]
作为一个数组,您可以使用$size
之类的运算符来计算&#34;键&#34;的数量,它现在等于数组中的条目。
对于早期版本,您可以在JavaScript评估中使用$where
条件:
Model.find(function() {
return (this.hasOwnProperty("preferences")) ?
Object.keys(this.preferences).length == 20 : false;
}).count()
后者实际上不是&#34;聚合&#34;,但光标数实际上是您从JavaScript评估中获得的所有内容。