如何使用MongoEngine中的$ push和$ slice限制更新数组中的元素数量

时间:2014-08-18 18:29:02

标签: python mongodb mongoengine

我有一个包含子文档数组的文档。

这些是文档和子文档的样子:

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”

1 个答案:

答案 0 :(得分:0)

使用returted新值的findAndModify怎么样? 如果达到限制 - 删除一个。