如何在 MongoDB 上的两个 id 字段上添加索引权重?

How to add index weight on two id fields on MongoDB?

我对两个 ObjectID 字段上的 $or 请求的 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')}]} )

结果:

索引:

谢谢!

How can I make sure a search will first look at the first argument of the $or expression and only then if no match looks at the second

你不能,因为那不是 MongoDB 的工作方式。

or should we split it into two requests and add this logic in our code?

是的,如果您必须执行此操作,则必须将其拆分为 2 个单独的查询。


此外,我认为最好阐明复合索引 works:

For a compound index, MongoDB can use the index to support queries on the index prefixes.

这就是您的查询未使用复合索引的原因,因为它不支持查询,来自 $or 文档:

When using indexes with $or queries, each clause of an $or can use its own index.

基本上{ device_id: ObjectId('624c6bada5b7f846e80af8ca')} 作为单独的查询执行,正如我们提到的,复合索引要求前缀成为查询的一部分,但在这种情况下前缀不存在。它比那个复杂一点,因为可以使用复合索引来支持第一个查询,我建议您阅读如何 Mongo 选择使用哪个索引以更好地理解该行为。