$or
對于兩個 ObjectID 欄位的請求,我有一個關于 Mongo 索引的問題。
如何確保搜索首先查看$or
運算式的第一個引數,然后才在沒有匹配項的情況下查看第二個引數,或者我們應該將其拆分為兩個請求并在我們的代碼中添加此邏輯?
我嘗試使用帶權重的復合索引,但它僅適用于文本搜索。
這是我嘗試過的:
@index({ user_id: 1 }, { unique: true, partialFilterExpression: { user_id: { $exists: true } } })
@index({ device_id: 1 }, { partialFilterExpression: { device_id: { $exists: true } } })
@index(
{ user_id: 1, device_id: 1 },
{
weights: {
user_id: 10,
},
partialFilterExpression: { user_id: { $exists: true }, device_id: { $exists: true } },
},
)
@modelOptions({
schemaOptions: {
collection: 'test',
timestamps: {
createdAt: 'created_at',
updatedAt: 'updated_at',
},
},
})
export class Test extends Base {
@prop({ required: false })
public user_id?: ObjectId
@prop({ required: false })
public device_id?: ObjectId
}
我正在嘗試的請求:
db.test.find( { $or: [ { user_id: ObjectId('624c6bada5b7f846e80af8cb')}, { device_id: ObjectId('624c6bada5b7f846e80af8ca')}]} )
結果 :
索引:
謝謝!
uj5u.com熱心網友回復:
我如何確保搜索將首先查看 $or 運算式的第一個引數,然后才在沒有匹配項的情況下查看第二個
你不能,因為這不是 MongoDB 的作業方式。
還是我們應該把它分成兩個請求并在我們的代碼中添加這個邏輯?
是的,如果您必須強制執行此操作,那么您必須將其拆分為 2 個單獨的查詢。
另外我認為最好澄清復合索引的作業原理:
對于復合索引,MongoDB 可以使用索引來支持對索引前綴的查??詢。
這就是您的查詢不使用復合索引的原因,因為它不支持$or檔案中的查詢:
當使用帶有 $or 查詢的索引時,$or 的每個子句都可以使用自己的索引。
基本上{ device_id: ObjectId('624c6bada5b7f846e80af8ca')}
是作為單獨的查詢執行的,正如我們提到的,復合索引要求前綴是查詢的一部分,但在這種情況下,前綴不存在。它比那個復雜一點,因為復合索引可以用于支持第一個查詢,我建議您閱讀有關 Mongo 如何選擇使用哪個索引來更好地理解該行為的資訊。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/481699.html
上一篇:為什么我們不直接做“app=require('express')”?
下一篇:返回列表