【发布时间】:2014-07-10 17:17:24
【问题描述】:
我正在尝试通过使用 mongoengine 定位列表项的 _id 从 ListField 中删除一个项目 - 我在这里指的是关于原子更新的 mongoengine 文档:http://docs.mongoengine.org/guide/querying.html#atomic-updates
型号
class Prospect(db.Document):
comments = db.ListField(db.EmbeddedDocumentField('Comment'))
class Comment(db.EmbeddedDocument):
_id = db.ObjectIdField(default=bson.ObjectId())
created_at = db.DateTimeField(default=datetime.datetime.now, required=True)
body = db.StringField(verbose_name="Note", required=True)
author = db.StringField(verbose_name="Name", max_length=255, required=True)
Mongo 文档如下所示:
...
"comments": [
{
"_id": {
"$oid": "53bebb55c3b5a0db7829c15f"
},
"created_at": {
"$date": "2014-07-09T18:26:58.444Z"
},
"body": "Did something\n",
"author": "Dave Roma"
},
我试图删除这样的评论:
prospect = Prospect.objects(id=request.form['prospect_id']).update_one(pull___id=request.form['comment_id'])
我收到一个 mongoengine invalidQueryError:
InvalidQueryError: Cannot resolve field "_id"
【问题讨论】:
-
尝试使用
id和_id = db.ObjectIdField(default=bson.ObjectId())将在模块加载时设置默认值——所以它们都将具有相同的ID!您需要使用可调用的 - 即错过() -
@Ross 谢谢 - 你说得对,每次都会产生相同的 id - 在这种情况下,你如何建议为 EmbeddedDocument 生成唯一的 ObjectId(我想模仿 mongoengine 如何创建一个 id对于普通文件)
-
你可以做兰巴:bson.ObjectId()
标签: python mongoengine flask-mongoengine