gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 12:32:12 24 4
gpt4 key购买 nike

我在 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
}

但是当我尝试使用 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'}}})

关于python - 使用 mongoengine 从字典中的列表中提取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32301142/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com