在有限的内存环境中计算MongoDB集合属性的不同值

时间:2017-01-14 13:21:59

标签: javascript node.js mongodb mongoose

用户架构(猫鼬):

{
  "name": String,
  ...
}

我需要计算所有不同的 name,而不要将它们作为列表请求,例如distinct方法(收集太大) ,会影响记忆力。)

我尝试过以下操作:

User
  .distinct('name')
  .count()
  .exec();

然而,count方法似乎覆盖了不同的过滤器,返回了User集合中所有对象的计数。

在有限的内存环境中计算MongoDB集合属性的不同值的有效方法是什么?

1 个答案:

答案 0 :(得分:2)

您可以使用以下聚合实现此目的:

User.aggregate([
    { $group: { _id: null, names:{$addToSet:"$name"} } },
    { $project: { count: { $size: "$names" } } } 
])
.exec(function(err, users){
   console.log(users.count)
})

$group聚合内,$addToSet运算符会在names数组中添加每个唯一名称。在$project聚合中,我们会按names运算符计算数组$size的大小,并将该值分配给count属性。