如何仅使用特定数量的键计数记录

时间:2017-06-05 00:17:34

标签: mongodb mongoose mongodb-query aggregation-framework

我在MongoDB中有一个用户模型如下:

{ _id: <some_id>,
  name: <some_name>,
  preferences: <this is an object with 1-20 key values pair>
}

我想获得所有首选项键的用户数(在首选项中有20个键的用户数)。 我该如何查询呢?

1 个答案:

答案 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评估中获得的所有内容。