2012-02-25 9 views
2

を返さない存在、私はこれがさえ可能であるかを理解していない:

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

Iは、第一及び第二のクエリの合計が第三に等しくなければなりませんと思います。

"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 

これは正解です。

問題の原因はどこですか?

インデックス:あなたはbcoded_metadataのためのスパースインデックスを使用しているため

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

それはモンゴシェルからまたはドライバを使用して、クエリでは? –

+0

@marcolinuxクエリはfromシェルから実行されます。 pythonスクリプトは、明らかにドライバを介して動作します。 – Moonwalker

+0

このバグでしょうか? https://jira.mongodb.org/browse/SERVER-3918 –

答えて

4

これがあります。 bcoded_metadataに疎索引がある場合、索引にはフィールドbcoded_metadataを持たない文書は含まれません。 bcoded_metadataフィールドのないドキュメントは元のクエリの一部ではないため、「カウント」は0を返します。

find:db.ts.find({"bcoded_metadata" : { "$exists" : false } })を実行すると結果も表示されません。非疎インデックスを使用するか、またはdb.ts.count();でフルカウントして、db.ts.find({"bcoded_metadata" : { "$exists" : true } })の結果を引きます。

もう少しそれを説明し、MongoDBは、このためのエラー/警告メッセージ取得した場合に追跡することができJIRAチケットがあります:https://jira.mongodb.org/browse/SERVER-3918

+0

実際には、 "bcoded_metadata"を除いてドキュメントを反復処理する必要があります。 どうすればよいですか?密なインデックスを実施する方法はありますか? ensureIndex({"bcoded_metadata":1}、{sparce:false}); は期待どおりに動作しませんが、その後も疎なインデックスがあります。 – Moonwalker

+0

さて、私は "bcoded_metadata"のインデックスを削除して、問題を解決しました。ありがとうございました。 – Moonwalker

+0

そのインデックスを削除する代わりに、それを*疎なインデックスではなく*作成することを検討してください。デフォルトでインデックスは疎ではありませんので、あなた自身で行ったことです。 – Derick

関連する問題