【问题标题】:Mongo .find() returning duplicate documents (with same _id) (!)Mongo .find() 返回重复文档(具有相同的_id)(!)
【发布时间】:2023-03-20 10:23:01
【问题描述】:

Mongo 似乎为同一查询返回了重复的文档,即它返回的文档比返回的文档中唯一的 _ids 多:

lobby-brain> count_iterated = 0; ids = {}
{}
lobby-brain> db.the_collection.find({
    'a_boolean_key': true 
}).forEach((el) => {
    count_iterated += 1; 
    ids[el._id] = (ids[el._id]||0) + 1;
})
lobby-brain> count_iterated
278
lobby-brain> Object.keys(ids).length
251

也就是说,返回的唯一_id个数是251——但是游标返回的文档有278个。

进一步调查:

lobby-brain> ids
{
  '60cb8cb92c909a974a96a430': 1,
  '61114dea1a13c86146729f21': 1,
  '6111513a1a13c861467d3dcf': 1,
  ...
  '61114c491a13c861466d39cf': 2,
  '61114bcc1a13c861466b9f8e': 2,
  ...
}
lobby-brain> db.the_collection.find({
    _id: ObjectId("61114c491a13c861466d39cf")
}).forEach((el) => print("foo"));
foo

> 

也就是说,实际上并没有具有相同_id 的重复文档——这只是.find() 的问题。

我尝试重新启动数据库,并重建涉及“a_boolean_key”的索引,结果相同。

我以前从未见过这种情况,这似乎是不可能的……这是什么原因造成的,我该如何解决?

版本信息:

Using MongoDB:          5.0.5
Using Mongosh:          1.0.4

它是一个独立的数据库,没有副本集或分片或类似的东西。

更多信息

需要注意的是,有一个复合索引,a_boolean_key 作为第一个索引,日期时间字段作为第二个索引。布尔键很少在数据库上更新(~一次/天),但 datetime 字段经常更新。

也许这些更新导致了重复的返回值?

2022 年 2 月 15 日更新:我添加了 Mongo JIRA task here

【问题讨论】:

  • MongoDB count() versus countDocuments() - 要获得准确的计数,请使用countDocuments()
  • 问题实际上不在于.count()——看看完整的例子。但在任何情况下,.count() 和 .countDocuments() 都返回正确的计数,即 251。我已将示例编辑为根本不使用 .count()。

标签: mongodb


【解决方案1】:

尝试检查您是否为a_boolean_key 字段存储索引。

执行count 时,MongoDB 可以仅使用 索引

所以,也许您没有所有文档的索引,所以count 方法结果不等于您的手动计数。

【讨论】:

  • 这很有趣——但是请看更新的示例,即使我不使用 .count(),我仍然会看到同样的问题——返回的唯一 _id 的数量少于总数返回的文档数。
  • 您可以访问数据库吗?那里的实际文档数量是多少,您真的有多个具有相同_id 的文档吗?
  • 我知道——正确的数字是 251。看起来数据库中没有实际的重复项。我用更多信息编辑了 OP。
【解决方案2】:

根据Mongo JIRA 的 Louis Williams 所说,这不是错误,而是预期的行为。

每天学习新东西!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-27
    • 1970-01-01
    • 1970-01-01
    • 2013-01-24
    相关资源
    最近更新 更多