使用 mongoengine 从字典中的列表中提取

Pull from a list in a dict using mongoengine

我在 mongo 引擎中有这个文档:

class Mydoc(db.Document):
    x = db.DictField()
    item_number = IntField()

我已经将这些数据写入文档

{
    "_id" : ObjectId("55e360cce725070909af4953"),
    "x" : {
        "mongo" : [
            {
                "list" : "lista"
            },
            {
                "list" : "listb"
            }
        ],
        "hello" : "world"
    },
    "item_number" : 1
}

好的,如果我想使用 mongo 引擎推送到 mongo 列表,我会这样做:

Mydoc.objects(item_number=1).update_one(push__x__mongo={"list" : "listc"})

效果很好,如果再次查询数据库,我会得到这个

{
    "_id" : ObjectId("55e360cce725070909af4953"),
    "x" : {
        "mongo" : [
            {
                "list" : "lista"
            },
            {
                "list" : "listb"
            },
            {
                "list" : "listc"
            }
        ],
        "hello" : "world"
    },
    "item_number" : 1
}

但是当我尝试使用 pull in mongo 引擎从同一个列表中拉取时:

Mydoc.objects(item_number=1).update_one(pull__x__mongo={'list': 'lista'})

我收到这个错误:

mongoengine.errors.OperationError: Update failed (Cannot apply $pull to a non-array value)

比较句子:

Mydoc.objects(item_number=1).update_one(push__x__mongo={"list" : "listc"}) # Works
Mydoc.objects(item_number=1).update_one(pull__x__mongo={"list" : "listc"}) # Error

如何从此列表中提取?

感谢任何帮助

我认为问题在于 mongoengine 不知道您的 x 文档的结构。您将其声明为 DictField,因此 mongoengine 认为您是从 DictField 而非 ListField 中提取数据。将 x 声明为 ListField,这两个查询应该都能正常工作。

我建议你也应该为此创建一个问题:
https://github.com/MongoEngine/mongoengine/issues

作为解决方法,您可以使用原始查询:

Mydoc.objects(item_number=1).update_one(__raw__={'$pull': {'x.mongo': {'list': 'listc'}}})