2012-06-25 67 views
19

我可以在mongodb查詢中使用OR和AND的組合嗎?mongodb用AND和OR查詢兩者

下面的代碼如預期

db.things.find({ 
      $and:[ 
       {$or:[ 
        {"first_name" : "john"}, 
        {"last_name" : "john"} 
       ]}, 
       {"phone": "12345678"} 
      ]}); 

不起作用數據庫內容:

> db.things.find(); 
{ "_id" : ObjectId("4fe8734ac27bc8be56947d60"), "first_name" : "john", "last_name" : "hersh", "phone" : "2222" } 
{ "_id" : ObjectId("4fe8736dc27bc8be56947d61"), "first_name" : "john", "last_name" : "hersh", "phone" : "12345678" } 
{ "_id" : ObjectId("4fe8737ec27bc8be56947d62"), "first_name" : "elton", "last_name" : "john", "phone" : "12345678" } 
{ "_id" : ObjectId("4fe8738ac27bc8be56947d63"), "first_name" : "eltonush", "last_name" : "john", "phone" : "5555" } 

查詢上述查詢時 - 我什麼也沒得到!

> db.things.find({$and:[{$or:[{"first_name" : "john"}, {"last_name" : "john"}]},{"phone": "12345678"}]}); 
> 

我使用蒙戈1.8.3

+0

我猜這是你正在運行的舊版本的MongoDB的問題。您的查詢似乎與2.0.6一起使用。 – Miikka

回答

8

我相信$,並且僅在MongoDB的V2.0 +支持。我很驚訝控制檯首先接受了這個表達。我將嘗試重新創建一個我擁有的1.8服務器。

另請參閱10Gen's Advanced Query Documentation$and

更新

我進了你的樣本數據同時作爲v1.8x和v2.0x MongoDB的服務器。該查詢適用於v2.0x,並在v1.8x上失敗。這證實了我(和Miikka's)懷疑問題出在$and和您的服務器版本。

我在網絡here上發現了一個(可以說)聰明的解決方法。我希望這有幫助。

-SethO

3

這是在下列方式可能(MongoDB的3.4)

這裏是很好的例子

https://docs.mongodb.com/manual/reference/operator/query/and/#and-queries-with-multiple-expressions-specifying-the-same-operator

 

     db.getCollection('tbl_menu_items').find({ 
     $and : [ 
      { $or : [ { price : 0.99 }, { price : 1.99 } ] }, 
      { $or : [ { sale : true }, { qty : { $lt : 20 } } ] } 
     ] 
    }) 

此查詢將選擇所有文件,其中:

價格場現值equ ALS 0.99或1.99,和 出售字段值等於真或數量字段的值小於20。

這裏是$以$或查詢即匹配任何的條件例如

的示例和條件

考慮下面的查詢......

 


     db.getCollection('tbl_menu_items').find(

     { '$or': 
      [ { '$and': 
       [ { location: { '$in': [ ObjectId("588054c63879f2e767a1d553") ] } }, 
        { is_ryward: 1 }, 
        { points_reqiured_to_redeem_reward: { '$lte': 500 } } ] }, 
      { '$and': 
       [ { location: { '$in': [ ObjectId("588054c63879f2e767a1d553") ] } }, 
        { is_freebie: 1 } ] } ] } 
     ) 



此查詢將選擇所有文件,其中:在588054c63879f2e767a1d553

位置陣列和is_ryward = 1和points_reqiured_to_redeem_reward <在588054c63879f2e767a1d553 500

或者

位置陣列和is_freebie

2
db.things.find({ 
    $and : [ 
     { $or : [ {"first_name" : "john"},{"last_name" : "john"} ] }, 
     { "Phone":"12345678" } 
    ] 
}) 

,並採取其具有2倍的表達的陣列。一個是first_name和last_name的OR,另一個是電話號碼。如果它不起作用,升級到最新版本的MongoDB。