Query-Performance

哪個查詢在 MongoDB 中表現更好(奧羅奧___這r這ror or傢伙)?

  • March 19, 2021

我有一個類似於以下的查詢;

   db.getCollection('list').aggregate([
   {
       $facet: {
           "events":[{
               $match: {
                  'type': 'Event'
               }
           }],
           "tasks": [{
               $match: {
                  'type': 'Task'
               }
           }]
       }
   },
   {$project: {activity:{$setUnion:['$events','$tasks']}}},
   {$unwind: '$activity'},
   {$replaceRoot: { newRoot: "$activity" }}
]);

編寫此查詢的另一種更簡單的方法是使用 $or 運算符。

   db.getCollection('list').aggregate([{
   $match: {
       $or: [{
           type: 'Event'
       }, {
           type: 'Task'
       }]
   }
}]);

來源:https ://gist.github.com/cthurston/7aead8229e10caa0be175babf7e8ddf1

我正在使用的查詢非常相似,除了我有其他欄位,而不僅僅是通過這個範例的“類型”。我的想法是,如果我使用**$facet**為每個查詢創建正確的索引(即在內部 $ facet). On the other hand, if I use $ 或者像範例中的查詢一樣,Mongo在嘗試為查詢找到正確的索引時可能會遇到困難。這是它的工作原理嗎?

編輯:似乎 MongoDB 可以處理 $or 語句的索引;

https://docs.mongodb.com/manual/reference/operator/query/or/#or-clauses-and-indexes

$facet - 索引使用說:

這 $ facet stage, and its sub-pipelines, cannot make use of indexes, even if its sub-pipelines use $ 匹配或 $facet 是否是管道中的第一階段。$facet 階段將始終在執行期間執行 COLLSCAN

$or 子句和索引說:

在評估 $or 表達式中的子句時,MongoDB 要麼執行集合掃描,要麼,如果索引支持所有子句,則 MongoDB 執行索引掃描。

而且,您的查詢$match階段:

$match: {
   $or: [
       { type: 'Event' }, 
       { type: 'Task' }
   ]
 }

可以簡單地寫成:

$match: { type: { $in: [ 'Event', 'Task' ] } }

$ or versus $ 在說:

使用時 $ or with that are equality checks for the value of the same field, use the $ in 運算符而不是 $or 運算符。

使用$or適當的索引可能比使用$facet階段執行得更好。

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