Mongodb
MongoDB 隱式與
我正在嘗試理解 mongodb 查詢,但我的一個查詢正在返回一條它不應該返回的記錄。
我想打電話
db.user.find({'referral.money':{'$ne':0, '$ne':null}})
獲取所有在他們的推薦數據中有一些美分的使用者。一些使用者的推薦數據不包括“錢”,而其他使用者則根本沒有任何推薦數據。
問題是執行該命令後,返回以下記錄:
{ "_id" : ObjectId("58362414af5d810d1c9ec7f0"), "user_id" : 22, "referral" : { "_cls" : "ReferralProgramA", "end_dtm" : ISODate("2016-12-23T23:19:48.014Z"), "money" : 0 } }
如果我是正確的,它不應該被退回,因為“錢”顯然是 0。
我的集合和記錄是使用 python 的 mongoengine 創建的,因此使用“_cls”欄位進行繼承。
我正在使用原始語句進行 find({}) 呼叫,因此 mongoengine 不會把它搞砸(我認為)。
問題是您的查詢對像
$ne
兩次使用相同的鍵 ( ),因此第二個值覆蓋了第一個值。大多數語言不支持標準對象/雜湊/字典表示中的重複鍵。如果您在
mongo
shell 中評估查詢對象,結果會更加明顯:> query = {'referral.money':{'$ne':0, '$ne':null}} { "referral.money": { "$ne": null } }
但是,您可以在隱式中使用具有相同結果的不同運算符
$and
。對於您的範例查詢,
$exists: true
等效於$ne: null
以下內容:db.user.find({'referral.money':{'$ne':0, $exists: true}})
或者,您可以重寫查詢以使用顯式
$and
:db.user.find({$and: [{'referral.money': {'$ne':0}}, {'referral.money':{'$ne':null}} ]})
注意:如果您將貨幣值儲存為浮點數,您應該小心使用浮點數進行四捨五入。MongoDB 手冊提供瞭如何對貨幣數據建模的範例。