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

时间:2012-02-25 10:36:46

标签: mongodb

老实说,我不明白这是怎么回事:

> 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
        }
]

1 个答案:

答案 0 :(得分:4)

这是因为您使用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