在MongoDB中执行distinct查询会产生错误:distinct太大,容量为16mb的MongoDB



我最近开始学习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字段。

最新更新