2017-07-06 14 views
1

集計クエリを実行するときにmongoDBの論理演算子を入れ子にしたり使用したりするときに、中括弧を使用するルールとは何ですか?MongoDb論理クエリ演算子とブレース

シナリオ1(作品):

$project: 
{ 
    $and: [ { $gt: [ "$qty", 100 ] }, { $lt: [ "$qty", 250 ] }] 
} 

scenario 2 (works): 

$project: 
{ 
$and:[{"data":"Residential"},{"status":true}],                      
} 

シナリオ3(作品)

$and: 
[ 
{ 
    $and:[{"data":"Residential"},{"status":true}],                       
    $and:[{"data":"Lobby"},{"status":true}],                                
} 
] 

シナリオ3(シナリオ2の結果とは異なる結果を与えるであろう)

$and: 
[ 
    { 
    $and:[{"data":"Residential"},{"status":true}],  
    }, 
    {                      
    $and:[{"data":"Lobby"},{"status":true}],                               
    } 
] 

シナリオ4(作品):

$and:[ 
    { 
    $or:[ 
     { 
      $and:[ 
       {"data":"Kids"}, 
       {"status":true} 
       ] 
     }, 
     {           
     $and:[      
       {"data":"Adults"}, 
       {"status":true}                         
      ]           
     } 
     ] 
     }                                
] 
私が何をした場合

シナリオ4は、異なる結果を与える:

$and:[ 
{           
$or: 
[ 
    { 
    $and:[{"data":"Kids"},{“status":true} ].           
    $and:[{"data":"Adults"},{"status":true} ]         
    } 
] 
} 
], 

このような詳細は、ドキュメントの任意の場所に示されていません。

答えて

0

だから私が気づいたことは、$と&または$で囲まれた中括弧が、私たちがそれらの使い方に応じて別のステップ/ステージとして扱うことができるということです。この概念は、合体と呼ばれ、集約パイプラインの最適化(https://docs.mongodb.com/manual/core/aggregation-pipeline-optimization/#match-match-coalescence)で詳細に説明されています。 例をあげて説明しましょう。

x = [1,2,3,5,8,13,21,34,55]と言うことができます。我々はそれを私たちの集合体でフィルタリングしたいと考えています。ケース1。 私は、理由のために、最初より大きく、そしてそれ以下で比較しました。我々は結果を取得する必要があります

$project: 
{ 
    $and: [ { $gt: [ "$qty", 25 ] },{ $lt: [ "$qty", 5 ] }] 
} 

8,13,21

次はこの1つの

$プロジェクトを試すことができます

$and: 
[ 
{ 
    $and:[{ $gt: [ "$qty", 25 ] }],                       
    $and:[{ $lt: [ "$qty", 5 ] }],                                
} 
] 

我々が得るべきです8,13,21の結果は、これを行っている理由は、一度に行う

最後の例

$and: 
[ 
    { 
    $and:[{ $gt: [ "$qty", 25 ] }],  
    }, 
    {                      
    $and:[{ $lt: [ "$qty", 5 ] }],                                
    } 
] 

我々は結果として、[]または空の取得する必要があります。

結果として空のリストを取得する理由は、上記のクエリを2段階で実行するためです。最初のステージでは、数値が012より大きくなると値xがフィルタリングされ、新しいリストが返されます。次の段階では、結果セットに25より大きい数値しか含まれていないので、5より小さい数字の最初の段階の結果がフィルタリングされます。

したがって、ここでのレッスンは、 $と$の中にあなたの質問の中の一つを入れておくか、またはそれぞれのブレースが別々のステージとして扱われ、次のステージが前のステージの結果に作用することに注意してください。