2

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 !

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

4

2 回答 2

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如果您经常查询它也可能需要。

于 2011-11-30T13:25:21.850 回答
1

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

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

不幸的是,Python 的 MongoEngine 还没有提供正确的方法来使用 $position 操作符进行 $push。

于 2015-06-28T11:49:57.877 回答