如何在MongoDB中从两个集合中计算一个字段的不同值数量

3

我需要操作mongoDB中的A和B两个集合,它们都有一个名为'user'的字段。我想知道A、B以及(A + B)中不同用户的数量。 伪代码如下:

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

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

2个回答

4

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

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

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

使用 Array.prototype.concat()Array.prototype.filter() 来获取 A 和 B 的不同用户数。
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;

2
要获取每个集合中不同用户的数量,您可以在mongo shell中运行以下命令:
db.A.distinct("user").length;
db.B.distinct("user").length;

要获取AB的不同用户数量,我会首先检索每个集合的不同数组,然后对数组进行联合并计算长度。如果您正在使用JavaScript,则建议使用Underscore.jsunion()方法来完成此操作。其用法在此处有解释。请注意,您可以通过在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函数,或者使用您的应用程序语言中的函数。

非常感谢你的出色解决方案。我选择Michael9的解决方案,因为它更本地化(无需加载其他js包)。 - kindadolf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接