如何使用MongoDB删除对象内部的对象(不在数组内部)

Wag*_*sUK 4 mongodb node.js

假设我有这个结构:

{
    "_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" : [ ]
        },
    }
}
Run Code Online (Sandbox Code Playgroud)

如何从子类别中删除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" : [ ]
        },
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,我的查询应遵循以下原则: db.categories.update({"_id": "ObjectId("52af7c1497bcaf410e000003")"}, {don't know this part yet})

编辑:当我知道要删除的子类别的名称时,答案确实在外壳上起作用,但是我无法在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)

                }

            )

        }

    });

};
Run Code Online (Sandbox Code Playgroud)

Phi*_*ipp 6

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

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