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块中放置什么。