2017-07-06 277 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(作品):

方案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];我們希望在我們的聚合中進行過濾。案例一。 我做了第一次大於然後小於一個原因的比較。

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

我們應該得到的結果8,13,21

接下來讓我們嘗試這個

$項目:

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

我們應該得到結果8,13,21原因是它一去不復返

最後一個例子

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

我們應該得到[]或空的結果。

我們將得到一個空列表的原因是,我們將在兩個階段運行上述查詢。第一階段將過濾我們的價值x大於25的數字,它會返回一個新的列表。然後下一階段將繼續過濾第一階段的結果,數字小於5,這將是空的,因爲結果集只包含大於25的數字。

所以,這裏的教訓是,如果你沒有了巢部分您的查詢在$和$中,或者被告知每個大括號被視爲一個單獨的階段,以下階段根據前一階段的結果進行處理。