2016-12-31 53 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": {}}]} 
     }) 

錯誤:

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

因爲$或should.be頂級鍵,而不是場內。請參閱文檔; https://docs.mongodb.com/manual/reference/operator/query/or/ –

+0

所以我怎樣才能達到我想要的,如果把它放在頂層,如何處理其他查詢參數? – Cl0udSt0ne

回答

1

根據$or docs$or只能用來作爲頂級鍵,沒有內場濾波器。所以,你需要反轉你的第二個條件:

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

由雅羅斯拉夫答案是正確的,但如果你這樣做

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

它只匹配不存在的記錄,與空字典不匹配的記錄。 – Cl0udSt0ne

+0

是的,這個查詢是錯誤的,或者是正確的方法 –