2016-12-31 7 views
1

は、いくつかのドキュメントがあると仮定しない:クエリMongoDBのドキュメントが存在するか存在し、空で

# No 'value' 
{ 
'name': 'T1', 
} 

# 'value' is a non-empty dict 
{ 
'name': 'T1', 
'value': {'a':'A', 'b':'B'} 
} 

# 'value' is a empty dict 
{ 
'name': 'T1', 
'value' : {} 
} 

私は、クエリにしたいどのような存在かvalueが存在し、空でないvalueとドキュメントです。私はこの方法以下しようと、動作しません:

cursor = collection.find({ 
      'name': {"$exists": 1}, 
      'value': {"$or": [{"$exists":0}, {"$eq": {}}]} 
     }) 

エラー:$or docs$orによると

pymongo.errors.OperationFailure: unknown operator: $or 
+0

ような何かを行う場合は$またはトップレベルのキーではなく、内部のフィールド何をshould.beので。 docsを参照してください。 https://docs.mongodb.com/manual/reference/operator/query/or/ –

+0

トップレベルに置いた場合、他のクエリの引数をどのように扱うのか、どうすれば実現できますか? – Cl0udSt0ne

答えて

1

はトップレベルのキーとしてではなく、フィールドフィルター内部で使用することができます。だから、あなたはあなたの第二の条件を反転する必要があります。

collection.find({ 
    "name": { "$exists": 1 }, 
    "$or": [ { "value": { "$exists": 0 } }, { "value": { "$eq": {} } } ] 
}) 
0

ヤロスラフによって答えが正しいですが、あなたは

cursor = collection.find({ 
      'name': {"$exists": 1}, 
      'value.a': {"$exists":0} 
     }); 
+0

レコードは一致しません。空のdictがあるレコードと一致しません。 – Cl0udSt0ne

+0

ええ、このクエリは誤りです、$または正しい方法です –

関連する問題