【发布时间】:2012-02-25 10:36:46
【问题描述】:
老实说,我不明白这怎么可能:
> 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
}
]
【问题讨论】:
-
您的查询是从 mongo shell 还是驱动程序?
-
@marcolinux 查询是从 from shell 执行的。 python 脚本显然是通过驱动程序工作的。
-
也许是这个错误? jira.mongodb.org/browse/SERVER-3918
-
@marcolinux 确实如此,谢谢!但是我应该使用什么样的时间解决方案?该链接不提供任何内容。
-
你需要找到另一种方法。但这很大程度上取决于我们的数据结构。例如,您可以强制
bcoded_metadata为实际值(例如zzzz),将索引从sparse更改为正常并暂时查询该值。但这取决于数据的填充方式以及应用程序的其他典型参数。
标签: mongodb