如何计算mongodb中两个集合中字段的不同值的数量

时间:2015-02-28 17:14:26

标签: javascript mongodb distinct

我必须使用mongoDB集合A和B.它们都有“用户”字段。 我想知道A,B和(A + B)中不同用户的数量。 伪代码如下:

A.user.distinct().count()
B.user.distinct().count()
(A.user union B.user)..distinct().count()

有人可以提出一些建议吗?

2 个答案:

答案 0 :(得分:4)

您不能将count()distinct一起使用来获取集合中不同用户的数量,因为它不是数组方法,而distinct会返回一个数组。您需要使用Array.length属性

要获取A或B中不同用户的数量,请使用以下

db.A.distinct('user').length
db.B.distinct('user').length

要获取A联盟B中不同用户的数量,请使用Array.prototype.concat()Array.prototype.filter()

var users = db.A.distinct('user');
users = users.concat(db.B.distinct('user'));
var num = users.filter(function(u, pos) {return users.indexOf(u) == pos; });
num.length;

答案 1 :(得分:2)

要获取每个集合中不同用户的数量,您可以在mongo shell中运行以下内容:

db.A.distinct("user").length;
db.B.distinct("user").length;

要获取AB联合中不同用户的数量,我首先会为每个集合检索不同的数组,然后对数组进行并集并找到长度。如果您使用的是JavaScript,我建议您使用Underscore.js' union()方法来做到这一点。其用法解释为here。请注意,您可以通过在shell中运行以下命令将Underscore.js(或任何JavaScript文件)加载到mongo shell:

load("path/to/underscore.js");

然后您可以轻松运行以下内容:

var a = db.A.distinct("user");
var b = db.B.distinct("user");
_.union(a, b).length;

否则,您可以实现自己的JavaScript函数,如here所述,或者应用程序语言中的函数。