【问题标题】:Pull from a list in a dict using mongoengine使用 mongoengine 从字典中的列表中提取
【发布时间】:2015-09-02 15:28:54
【问题描述】:

我在 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: 更新失败(无法应用 $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

如何从这个列表中提取?

感谢您的帮助

【问题讨论】:

    标签: python mongodb mongoengine


    【解决方案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'}}})
    

    【讨论】:

    • 谢谢,raw 效果很好,也最好用mongodb语法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 2016-09-24
    • 2011-07-16
    • 2017-12-15
    • 2018-08-30
    相关资源
    最近更新 更多