如何为 ReferenceField mongoengine 创建索引

How to create index for ReferenceField mongoengine

我想为 ReferenceField 创建索引以便查询可以更快地工作,但我不知道如何使用 mongoengine 通过在 class meta 属性:

这是我写的 Post 文档代码:

class Post(Document):
  slug = StringField(max_length=60, required=True)
  content = StringField(required=True)
  user_id = ReferenceField(document_type='User', dbref=True, required=True)
  published_at = DateTimeField(default=datetime.now, required=True)
  updated_at = DateTimeField(default=datetime.now, required=True)

  meta = {
    'collection': 'social_posts',
    'indexes': [
      'user_id.$id'
    ]
  }

当我尝试为 user_id.$id 创建索引(这是 ReferenceField 存储在 mongodb 中的方式时,抛出以下错误:

mongoengine.errors.LookUpError: Cannot perform join in mongoDB: user_id__$id

要在 mongoengine 中创建 ReferenceField 的索引,您只需指定字段名称 - 不带后缀 .$id

所以你的代码应该是这样的:

meta = {
'collection': 'social_posts',
'indexes': [
  'user_id'
]
}

Mongoengine 会自动在引用的 id 上创建索引,即使它是一个 DBRef。

使用MongoEngine创建索引时请小心。默认情况下,库总是尝试在您每次插入内容 时创建一个索引。 MongoDB 中的索引创建是一个会导致性能问题的阻塞操作。

你应该始终避免它。我的建议是执行以下操作

import mongoengine as me

class MongoModel(me.Document):

    some_field = me.StringField()
    other_field = me.StringField()

    meta = {
        "auto_create_index": False,
        "index_background": True,
        "indexes": [
            "other_field",
        ]
    }

并且他们有一个单独的命令来 运行 创建索引,就像您在任何其他数据库中所做的那样