如何在NodeJS和MongoDB中解决这个(IMO)意外的行为

基本上我在我的分类模型文件中有这个function:

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": "" } } ,对函数中的值进行硬编码,所以问题似乎只有当我传递一个stringvariables,我不明白为什么。

有任何想法吗?

PS:请注意,在这种情况下,上述是为了删除一个对象内的对象,因此是空格“”。

当你创build这个对象文字时:

 { $unset : { finalSub: "" } } 

你得到:

 { "$unset": { "finalSub": "" } } 

这显然不是你想要的。 但是,除非您希望$unset部分抛出ReferenceError ,否则它是一致的。 你将不得不以不同的方式构build该对象:

 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) } )