哪個查詢在 MongoDB 中表現更好(奧羅奧___這r這ror or傢伙)?
我有一個類似於以下的查詢;
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 stage, and its sub-pipelines, cannot make use of indexes, even if its sub-pipelines use $ 匹配或 $facet 是否是管道中的第一階段。$facet 階段將始終在執行期間執行 COLLSCAN。
在評估 $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
階段執行得更好。