Как обновить / удалить встроенный документ в ListField на основе его идентификатора mongoengine? - PullRequest
0 голосов
/ 09 октября 2019

У меня есть следующие документы:

class Note(EmbeddedDocument):
    value = mongo_db.StringField(max_length=200, required=True)
    id = mongo_db.UUIDField(required=True, primary_key=True)


class Post(Document,):
    notes = mongo_db.ListField(mongo_db.EmbeddedDocumentField(Note))

Как написать оператор, который обновляет поле value для объекта Note в списке объекта Post. другими словами, как написать что-то, что делает следующее:

update(post_id, note_id, new_valye)

Подобным образом, как я могу удалить экземпляр встроенных документов Note:

delete(post_id, note_id)

Ответы [ 2 ]

1 голос
/ 10 октября 2019

Сначала я отредактировал Мой Post документ, чтобы получить преимущества EmbeddedDocumentListField:

class Note(EmbeddedDocument):
    value = mongo_db.StringField(max_length=200, required=True)
    id = mongo_db.UUIDField(required=True, primary_key=True)


class Post(Document,):
    notes = mongo_db.EmbeddedDocumentListField(Note, required=False)

Затем используется для обновления:

    Post.objects(
        id=post_id, 
        notes__id=note_id
    ).update(
            set__notes__S__value=my_value
    ) 

И для удаления:

    Post.objects(id=post_id).update_one(
        pull__notes__id=note_id
    )

Но я думаю, с этим подходом есть проблемы, первое обновление сейчас сложно написать, если вы обновляете много полей.

0 голосов
/ 09 октября 2019

У вас есть 2 способа сделать это, давайте предположим, что вы хотите обновить второй элемент списка (то есть с индексом = 1):

1) Получите экземпляр вашего документа и используйте .save()

post = Post.objects().first()
post.notes[1].value = 'new_value'
post.save()

2) Если все, что вам нужно, это обновить поле документа и вы знаете его положение в массиве, то вы можете использовать:

Post.objects.update(set__notes__1__value='new_value')
...