Mongodb

MongoDB 隱式與

  • November 24, 2016

我正在嘗試理解 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兩次使用相同的鍵 ( ),因此第二個值覆蓋了第一個值。大多數語言不支持標準對象/雜湊/字典表示中的重複鍵。

如果您在mongoshell 中評估查詢對象,結果會更加明顯:

> 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 手冊提供瞭如何對貨幣數據建模的範例。

引用自:https://dba.stackexchange.com/questions/156233