Mongoengine может подталкивать элементы к спискам, добавляя их
BlogPost.objects(id=post.id).update_one(push__tags='nosql')
Я хочу добавить вместо добавления, есть ли способ?
Другой альтернативный вопрос к той же проблеме.
Я могу запросить в списке по такой позиции
BlogPost.objects(tags__0='nosql')
Есть ли способ указать последний элемент в списке, например -1 index в списках python?
BlogPost.objects(tags__-1='nosql')# ?.. I wish !
Ответы на любой из двух вопросов помогут решить мою проблему. Заранее спасибо.
Ни одна из этих операций не возможна, но вы можете легко обходить ее, эмулируя доступ к последнему элементу массива с другим полем. Предположим, что ваша модель:
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
если вы также часто запрашиваете это.
Единственный способ, которым я смог достичь надлежащего добавления, - это использовать пифонический способ добавления списка, а затем сохранить документ. Вот так:
blog_post = BlogPost.objects.get(id=post.id)
blog_post.tags.insert(0,'nosql')
blog_post.save()
К сожалению, MongoEngine для Python еще не предоставил надлежащего способа использования оператора $ position для $ push.