Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用mongoengine从dict中的列表中提取_Python_Mongodb_Mongoengine - Fatal编程技术网

Python 使用mongoengine从dict中的列表中提取

Python 使用mongoengine从dict中的列表中提取,python,mongodb,mongoengine,Python,Mongodb,Mongoengine,我在mongo engine中有此文档: class Mydoc(db.Document): x = db.DictField() item_number = IntField() Mydoc.objects(item_number=1).update_one(pull__x__mongo={'list': 'lista'}) 我把这些数据放进了文件里 { "_id" : ObjectId("55e360cce725070909af4953"), "x" :

我在mongo engine中有此文档:

class Mydoc(db.Document):
    x = db.DictField()
    item_number = IntField()
Mydoc.objects(item_number=1).update_one(pull__x__mongo={'list': 'lista'})
我把这些数据放进了文件里

{
    "_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
}
但当我尝试使用pull-in mongo引擎从同一列表中提取时:

class Mydoc(db.Document):
    x = db.DictField()
    item_number = IntField()
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
我如何从这个列表中提取


非常感谢您的帮助

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

我建议您也为此创建一个问题:

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

Mydoc.objects(item_number=1).update_one(__raw__={'$pull': {'x.mongo': {'list': 'listc'}}})
谢谢,raw工作得很好,使用mongodb语法也更好。