我最近开始学习MongoDB,我正试图通过从一个名为linkedin
的特定集合中获取列的不同值(称为universal
(来查询数据库。
与此类似的sql查询是:SELECT COUNT(DISTINCT(universal)) FROM linkedin WHERE universal IS NOT NULL
我使用DISTINCT使用了以下命令:
db.linkedin.distinct('universal', {'universal' : {'$ne': null}}).length
我对一个不是很大的数据库也做了同样的尝试,它奏效了。但我意识到,当我运行distinct too big, 16mb cap
时,它会给一个巨大的数据库带来错误
我读了一些关于它的文章,我可以使用.agregate而不是.different,我不清楚如何安排.agregate查询来执行与我使用distinct执行的查询相同的查询。
我能在这方面得到一些帮助吗?或者是否有更好的方法来实现这一点?
感谢
以下是使用聚合查找不同值数量的两种不同方法:
db.linkedin.aggregate([
{ $match: { universal: { $ne: null } } },
{ $group: { _id: "$universal" } },
{ $count: "universal_count" }
])
和
db.linkedin.aggregate([
{ $match: { universal: { $ne: null } } },
{ $group: { _id: "$universal" } },
{ $group: { _id: null, universal_count: { $sum: 1 } } },
{ $project: { _id: 0 } }
])
第一个管道使用$count阶段,该阶段仅适用于版本>= 3.4
,但它们都实现了相同的功能。
结果将是包含universal_count
字段的单个文档,该字段是不同的universal
值的数目。
解释
第一阶段,$match将选择具有非空universal
字段的文档。
第二阶段,$group将把具有相同_id
值的文档分组在一起。由于_id
字段是唯一的,因此使用universal
的值作为_id
将为每个不同的universal
值创建一个文档。
$count
阶段相当于最后两个$group
和$project
阶段,所以我将对此进行解释。
第三个CCD_ 18阶段从前一阶段获取每个文档并将其分组为单个文档,因为该阶段的CCD_ 19是CCD_ 20。$sum运算符用于计算作为universal_count
字段的输入文档数。
最后,$project阶段从输出中删除_id
字段,只留下universal_count
字段。