【问题标题】:performing distinct query in MongoDB generates error : distinct too big, 16mb cap MongoDB在 MongoDB 中执行 distinct 查询会产生错误: distinct too big, 16mb cap MongoDB
【发布时间】:2020-12-09 19:22:52
【问题描述】:

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

我做了一些阅读,我可以使用 .aggregate 而不是 .distinct,我不清楚如何安排 .aggregate 查询来执行我使用 distinct 执行的相同查询。

我能得到一些帮助吗?或者是否有更好的方法来完成这个?

谢谢

【问题讨论】:

  • 您使用的是哪个版本的 MongoDB?

标签: mongodb


【解决方案1】:

您可以通过以下两种不同的方式使用聚合来查找不同值的数量:

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 阶段,所以我将解释这些。

第三个$group 阶段然后从前一个阶段获取每个文档并将其分组到一个文档中,因为此阶段的_idnull$sum 运算符用于统计输入文档的数量作为universal_count 字段。

最后,$project 阶段从输出中删除 _id 字段,只留下 universal_count 字段。

【讨论】:

  • 感谢您的详细解答!我真的很感激这个
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-23
  • 2016-11-18
  • 1970-01-01
相关资源
最近更新 更多