使用mongoengine从dict中的列表中拉出

时间:2015-08-30 21:04:20

标签: python mongodb 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
}

好的,如果我想使用mongoengine推送到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
}

但是当我尝试使用拉入mongo引擎从同一个列表中拉出来时:

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

我收到此错误:

  

mongoengine.errors.OperationError:更新失败(无法应用$ pull   到非数组值)

比较句子:

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

如何从此列表中提取?

我感谢任何帮助

1 个答案:

答案 0 :(得分:1)

我认为问题在于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'}}})