我有一个包含子文档数组的文档。
这些是文档和子文档的样子:
class Activity_Comment(EmbeddedDocument):
author_name = StringField()
text_excerpt = StringField()
url = StringField()
class Author_Activity(Document):
author_id = StringField(required=True,primary_key=True)
author_name = StringField()
author_bio = StringField()
latest_comments = ListField(EmbeddedDocumentField(Activity_Comment))
可能有多个服务器进程可以同时修改文档。
所以我想将update_one
方法与upsert=True
一起使用。
我还想将数组中的子文档数限制为5。 根据这些链接,MongoDB似乎可以实现这一点:
http://docs.mongodb.org/manual/tutorial/limit-number-of-elements-in-updated-array/ http://docs.mongodb.org/manual/reference/operator/update/slice/
这些链接表明我应该使用$push
将子文档插入到数组中,并$slice
将数组长度限制为所需的值。
但是,我无法弄清楚如何使用MongoEngine来做到这一点。我尝试了以下代码
Author_Activity.objects(author_id="1").update_one(push__latest_comments=activity_comment,slice__latest_comments=5, upsert=True)
但它引发了以下异常:
Traceback(最近一次调用最后一次):文件“”,第1行,in 文件 “/newsoftheworld/local/lib/python2.7/site-packages/mongoengine/queryset/base.py” 第467行,在update_one中 upsert = upsert,multi = False,write_concern = write_concern,** update)文件 “/newsoftheworld/local/lib/python2.7/site-packages/mongoengine/queryset/base.py” 第430行,更新中 update = transform.update(queryset._document,** update)文件“/newsoftheworld/local/lib/python2.7/site-packages/mongoengine/queryset/transform.py”, 第181行,更新中 引发InvalidQueryError(e)InvalidQueryError:无法解析字段“slice”
答案 0 :(得分:0)
使用returted新值的findAndModify怎么样? 如果达到限制 - 删除一个。