如何在Mongoengine中将元素添加到列表中

时间:2011-11-30 12:48:32

标签: python mongodb mongoengine

Mongoengine可以通过附加元素将元素推送到列表

BlogPost.objects(id=post.id).update_one(push__tags='nosql')

我想在前置而不是追加,有办法吗?

针对同一问题的另一个替代问题..
我可以按照这样的位置在列表中查询

BlogPost.objects(tags__0='nosql')

有没有办法指定列表中的最后一个元素,比如python列表中的-1索引?

BlogPost.objects(tags__-1='nosql')# ?.. I wish !

任何两个问题的答案都将解决我的问题。 提前谢谢。

2 个答案:

答案 0 :(得分:1)

这些操作都不可能,但是你可以通过模拟对另一个字段的最后一个数组元素的访问来相当容易地解决它。假设您的模型是:

class BlogPost(Document):
    tags = ListField(StringField())
    # other things

添加字段last_tag

class BlogPost(Document):
    tags = ListField(StringField())
    last_tag = StringField()
    # other things

然后,在更新时:

BlogPost.objects(id=post.id).update_one(push__tags='nosql', set__last_tag='nosql')

查询时:

BlogPost.objects(last_tag='nosql')

您需要确保last_tag已编入索引,如果您经常查询,也可能tags

答案 1 :(得分:0)

我能够实现正确前置的唯一方法是使用pythonic方式预先添加到列表中然后保存文档。像这样:

blog_post = BlogPost.objects.get(id=post.id)
blog_post.tags.insert(0,'nosql')
blog_post.save()

不幸的是,MongoEngine for Python还没有为$ push提供一个使用$ position运算符的正确方法。