2012-06-25 8 views
19

mongodbクエリでORとANDの組み合わせを使用できますか?私は何を取得 -mongodbはANDとORの両方でクエリを実行します

> 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"} 
      ]}); 

データベースの内容としては動作しません!

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

私は$を信じ、唯一のMongoDBのv2.0 +でサポートされて1.8.3

+0

これは、あなたが実行しているMongoDBの古いバージョンの問題だと思います。あなたのクエリは2.0.6で動作するようです。 – Miikka

答えて

8

モンゴを使用しています。私はコンソールが最初に表現を受け入れたことに驚いています。私が持っている1.8サーバに対して再作成しようとします。

$andの場合は10Gen's Advanced Query Documentationもチェックしてください。

更新

私はv1.8xとv2.0xのMongoDBサーバの両方にあなたのサンプルデータを入力します。クエリはv2.0xで動作し、v1.8xでは失敗します。これは、問題が$andとあなたのサーバーのバージョンであるという私の(そしてMiikkaの)疑惑を確認します。

私は、おそらく巧妙なこのWebの回避策をWeb 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 150または1.99、および 販売フィールドの値がtrueに等しいか、数量フィールドの値がここ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とis_freebie

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

または

位置アレイと2式を有する配列をとります。1つはfirst_nameとlast_nameのORであり、2つ目は電話番号です。 MongoDBの最新バージョンにアップグレードしてください。

関連する問題