如何为ReferenceField mongoengine创建索引

时间:2017-08-30 12:30:52

标签: python mongodb indexing pymongo mongoengine

我想为ReferenceField创建索引,以便查询可以更快地运行,但我不知道如何通过在mongoengine类属性中定义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 ,会引发以下错误:

 <script src="/portal/libs/jquery_1.11.0/jquery-1.11.3.min.js"></script>
<script src="js/provider-libs/ws-client.js"></script>
<script src="http://vizjs.org/viz.v1.0.0.min.js"></script>
<script src="/portal/libs/analytics-wso2-2.0.0/d3.min.js"></script>
<script src="/portal/libs/analytics-wso2-2.0.0/vega.js"></script>
<script src="/portal/libs/analytics-wso2-2.0.0/VizGrammar.min.js"></script>
<script src="/portal/libs/analytics-wso2-2.0.0/wso2gadgets.js"></script>
<script src="/portal/libs/analytics-wso2-2.0.0/chart-utils.js"></script>
<script src="/portal/js/carbon-analytics.js"></script>
<script src="js/core/provider-client.js"></script>
<script src="js/core/gadget-util.js"></script>
<script src="js/core/gadget-core.js"></script>

2 个答案:

答案 0 :(得分:2)

使用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",
        ]
    }

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

答案 1 :(得分:1)

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

所以你的代码就是这样:

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

Mongoengine会自动为引用的id创建索引,即使它是DBRef。