【问题标题】:How to remove an object inside an object with MongoDB (not inside array) [duplicate]如何使用 MongoDB 删除对象内的对象(不在数组内)[重复]
【发布时间】:2013-12-17 21:56:19
【问题描述】:

假设我有这个结构:

{
    "_id" : ObjectId("52af7c1497bcaf410e000002"),
    "created_at" : ISODate("2013-12-16T22:17:56.219Z"),
    "name" : "Hot",
    "subcategories" : {
        "Loco" : {
            "subcategory" : "Loco",
                "id" : "522423de-fffe-44be-ed3b-93fdd50fdb4f",
                "products" : [ ]
        },
        "Loco2" : {
            "subcategory" : "Loco2",
                "id" : "522423de-fffe-44be-ed3b-93fdd50fd55",
                "products" : [ ]
        },
    }
}

如何从子类别中删除 Loco2,而其他所有内容都保持不变?

请注意,我的对象选择器是 ObjectId,因为其他文档的结构可能具有相同的子类别名称,属于不同的文档。例如,我也可以有另一个像这样的对象:

{
    "_id" : ObjectId("52af7c1497bcaf410e000003"),
    "created_at" : ISODate("2013-12-16T22:17:56.219Z"),
    "name" : "Medium",
    "subcategories" : {
        "Loco" : {
            "subcategory" : "Loco",
                "id" : "522423de-fffe-44be-ed3b-93fdd50332b4f",
                "products" : [ ]
        },
        "Loco2" : {
            "subcategory" : "Loco2",
                "id" : "522423de-fffe-44be-ed3b-93fdd522d55",
                "products" : [ ]
        },
    }
}

所以我的查询应该是这样的:db.categories.update({"_id": "ObjectId("52af7c1497bcaf410e000003")"}, {don't know this part yet})

编辑:当我知道要删除的子类别的名称时,答案在 shell 上确实有效,但是我无法在我的 Node 应用程序中使用它:

    Categories.prototype.delSubcategory = function(categoryId, subcategory, callback) {

    this.getCollection(function(error, category_collection) {

        if(error) callback(error);

        else {

            category_collection.update(

                {_id: category_collection.db.bson_deserializer.ObjectID.createFromHexString(categoryId)},
                { $unset : { "subcategories.Loco2: "" } },
                function(error, subcategory) {

                    if(error) callback(error);

                    else callback(null, subcategory)

                }

            )

        }

    });

};

【问题讨论】:

    标签: node.js mongodb


    【解决方案1】:

    您可以使用$unset operator 从文档或其子对象中删除字段。

    db.collection_name.update(
          {"_id": ObjectId("52af7c1497bcaf410e000003")}, 
          { $unset : { "subcategories.Loco2" : "" } }
    );
    

    【讨论】:

    • 我已经尝试过了,但它不起作用。当我尝试使用 shell 时,我收到了这个错误: SyntaxError: Unexpected token ILLEGAL
    • @Philipp 的回答有语法错误,应该是{"_id": ObjectId("52af7c1497bcaf410e000003") },即没有引号。您必须调用一个从string 创建ObjectId 的构造函数。
    • 是的,我又试了一次,它确实在 shell 上工作。但是有一个问题:如何将“subcategories.Loco2”中的 Loco2 作为 Node 应用程序中的变量?我试过"subcategories" + myVar: "" 但没有用。既不是“subcategories.myVar”。全文是这样的:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-31
    • 2017-06-20
    • 2019-06-23
    • 2021-11-09
    • 1970-01-01
    相关资源
    最近更新 更多