使用 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'}}})
我在 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'}}})