我想为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>
答案 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。