Node.js 如何解决NodeJS和MongoDB中的这种(IMO)意外行为

Node.js 如何解决NodeJS和MongoDB中的这种(IMO)意外行为,node.js,mongodb,Node.js,Mongodb,基本上,我的类别模型文件中有此函数: Categories.prototype.delSubcategory = function(categoryId, subcategory, callback) { var finalSub = "subcategories." + subcategory; finalSub = '"' + finalSub + '"'; this.getCollection(function(error, category_collectio

基本上,我的类别模型文件中有此函数:

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

    var finalSub = "subcategories." + subcategory;
    finalSub = '"' + finalSub + '"';

    this.getCollection(function(error, category_collection) {

        if(error) callback(error);

        else {

            category_collection.update(

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

                    if(error) callback(error);

                    else callback(null, subcategory)

                }

            )

        }

    });

};
如果我
console.log(finalSub)
我会看到
的“subcategories.myvalue”
按预期打印。因此,当我在应用程序中使用此函数时,该函数应按预期更新文档,但实际情况并非如此。两者都没有显示任何错误。如果我在shell中复制一个类似的行为,它就会工作,文档也会相应地更新

如果我使用
{$unset:{finalSub:“}}}
而不是使用
{$unset:{“subcategories.myValue”:“}}}}
,则在函数中对值进行硬编码,这样,问题似乎只在我在变量中传递字符串时才会出现,我无法理解原因

有什么想法吗


PS:请注意,在这种情况下,上述操作旨在删除对象中的对象,因此在创建此对象文字时使用空“.

{ $unset : { finalSub: "" } }
你会得到:

{ "$unset": { "finalSub": "" } }
这显然不是你想要的。但是,除非您希望
$unset
部分抛出
ReferenceError
,否则它是一致的。您必须以不同的方式构建该对象:

updateObj = { $unset: {} }
updateObj.$unset[finalSub] = ""
然后可以使用
updateObj
代替文字:

        updateObj = { $unset: {} }
        updateObj.$unset[finalSub] = ""
        category_collection.update(

            {_id: category_collection.db.bson_deserializer.ObjectID.createFromHexString(categoryId)},
            updateObj,
            function(error, subcategory) {

                if(error) callback(error);

                else callback(null, subcategory)

            }

        )

不幸的是,如果我在以下结构中使用前面的代码,
{updatebj.$unset[finalSub]=“”}
,mongo会抱怨这也不起作用。事实上,我甚至不能在对象内部使用点符号。看起来像是对象内部的代码没有被执行,只是作为字符串传递。@WagnerMatosUK您似乎不明白对象文字在javascript中是如何工作的。如果你使用我提供的代码而不是文字,它会工作得很好。不幸的是,你是对的,我是js新手,仍然对一些事情感到困惑。我试过你的代码,但似乎不起作用。可能是因为我把它放错了。上面的函数在代码中是什么样子的?我所有的尝试都失败了。@WagnerMatosUK我已经编辑过,以显示您应该在该函数的else块中放置什么。