我必须使用mongoDB集合A和B.它们都有“用户”字段。 我想知道A,B和(A + B)中不同用户的数量。 伪代码如下:
A.user.distinct().count()
B.user.distinct().count()
(A.user union B.user)..distinct().count()
有人可以提出一些建议吗?
答案 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;
要获取A
和B
联合中不同用户的数量,我首先会为每个集合检索不同的数组,然后对数组进行并集并找到长度。如果您使用的是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所述,或者应用程序语言中的函数。