Mongoengine 原始 find_and_modify 查询给出 "Must either update or remove" 异常

Mongoengine raw find_and_modify query gives "Must either update or remove" exception

我正在使用 Django + mongoengine 我想更新我的 Bookscollection 文档中的书籍(嵌入式文档)计数。我想要 return 完整对象的更新查询。因此我使用的是 'find_and_modify'。但即使我使用更新或删除字段。我仍然收到 'Must either update or remove' 的错误。 这是我的代码片段 -

for book_id in book_list:
        book_col = BookCollection._get_collection().find_and_modify({
                        'query': {'coll_id':book_coll_id,'book.book_id':book_id},
                        'update':{'$inc':
                             {'book.$.quantity' : 1}
                         },
                        'new':True
        })

这里有什么问题?

find_and_modify 采用关键字参数,这就是您收到该错误消息的原因。

for book_id in book_list:
    book_col = BookCollection._get_collection().find_and_modify({
                        query={'coll_id':book_coll_id,'book.book_id': book_id},
                        update={'$inc': {'book.$.quantity' : 1}},
                        new=True
                })

您还应该知道 find_and_modify 在 pymongo3.0 中已弃用,您应该使用 find_one_and_update if your diver is pymongo 2.9 或更新版本。

BookCollection._get_collection().find_and_modify(
                    query={'coll_id':book_coll_id,'book.book_id': book_id},
                    update={'$inc': {'book.$.quantity' : 1}},
                    new=True
            )

对于在 pymongo 3.0 之后来到这里的任何人,您需要使用 .find_one_and_update 而不是 find_and_modify,因为它已被弃用。

示例:

book_col = BookCollection._get_collection().find_one_and_update(
                filter={'coll_id':book_coll_id,'book.book_id': book_id},
                update={'$inc': {'book.$.quantity' : 1}},
                new=True
        )