db.ts.find-6ren">
gpt4 book ai didi

mongodb - Mongo $exists 查询不返回正确的文档

转载 作者:可可西里 更新时间:2023-11-01 10:01:28 26 4
gpt4 key购买 nike

老实说,我不明白这怎么可能:

> db.ts.find({"bcoded_metadata" : { "$exists" : true} } ).count()
199049
> db.ts.find({"bcoded_metadata" : { "$exists" : false} } ).count()
0
> db.ts.count()
2507873

我认为第一个和第二个查询的总和必须等于第三个。

我需要从集合中选择“bcoded_metadata”不存在但查询不返回任何内容的所有元素。当我在简单的 python 脚本中迭代这个集合并手动检查“bcoded_metadata”是否存在时,一切都按预期工作。

from pymongo import Connection
connection = Connection('127.0.0.1', 27017)
db = connection.data
c = 0
for item in db.ts.find():
if not "bcoded_metadata" in item.keys():
c+= 1
print c



python test.py
2308824

这是正确答案。

问题的根源在哪里?

索引:

> db.ts.getIndexes();
[
{
"name" : "_id_",
"ns" : "data.ts",
"key" : {
"_id" : 1
},
"v" : 0
},
{
"_id" : ObjectId("4f3c299b4c4a5ccfddbe4069"),
"ns" : "data.ts",
"key" : {
"last_seen" : 1
},
"name" : "last_seen_1",
"v" : 0
},
{
"_id" : ObjectId("4f3c2cef4c4a5ccfddbe406a"),
"ns" : "data.ts",
"key" : {
"attempts" : -1
},
"name" : "attempts_-1",
"v" : 0
},
{
"_id" : ObjectId("4f4279ed6aca13be31acbe6d"),
"ns" : "data.ts",
"key" : {
"bcoded_metadata" : 1
},
"name" : "bcoded_metadata_1",
"sparse" : true,
"v" : 0
}
]

最佳答案

这是因为您对 bcoded_metadata 使用了稀疏索引。如果您在 bcoded_metadata 上有一个稀疏索引,那么该索引将不包含没有字段 bcoded_metadata 的文档。没有 bcoded_metadata 字段的文档不是您原始查询的一部分,因此“count”将返回 0。

如果您只运行查找:db.ts.find({"bcoded_metadata": { "$exists": false } }) 那么您也不会得到任何结果。您可以使用非稀疏索引,也可以使用 db.ts.count(); 进行完整计数,然后减去 db.ts.find({"bcoded_metadata": { "$exists": true } }) 结果。

有一个 JIRA 票证对其进行了更多解释,并且可以在 MongoDB 获得错误/警告消息的情况下对其进行跟踪:https://jira.mongodb.org/browse/SERVER-3918

关于mongodb - Mongo $exists 查询不返回正确的文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9443252/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com