【发布时间】: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