MongoDB Node JS – 从文档对象内部的对象中删除一个条目

我正在尝试使用本地mongodb驱动程序在Node JS中创build一个命令,以从文档对象内部的对象中删除键值对。

我有以下格式的mongoDB集合:

{ "name" : "PrakashPM" "data" : { "Jan-2017" : "2,3,1", "Dec-2016" : "1,2,0", "Nov-2016" : "9,9,9" } }, { "name" : "Valavan" "data" : { "Jan-2017" : "1,1,1", "Dec-2016" : "3,3,3", "Nov-2016" : "9,9,9" } } 

我的目标是去除“2016年12月”:“名称”内的“1,2,0”:“PrakashPM”

我的代码:

 var mongoName = 'PrakashPM'; var mongoDate = "'data'.'Dec-2016'"; // TRIALS // var mongoDate = "data.'Dec-2016'"; // var mongoDate = "data.Dec-2016"; var mongoVal = "'1,2,0'"; // TRIALS // var mongoVal = "1,2,0"; mycollection.update( { name: mongoName }, { $unset: {mongoDate : mongoVal} } ); 

注意:我正在PUT请求函数内执行上述操作。

我尝试了许多可能的方式(TRIALS)的input值(mongoDate,mongoVal),但我无法实现下面的结果。

另外,是否可以通过使用密钥删除键值对条目? (即在这种情况下{$ unset:{mongoDate}}或类似的东西)

预期结果:

  { "name" : "PrakashPM" "data" : { "Jan-2017" : "2,3,1", "Nov-2016" : "9,9,9" } }, { "name" : "Valavan" "data" : { "Jan-2017" : "1,1,1", "Dec-2016" : "3,3,3", "Nov-2016" : "9,9,9" } } 

假设req.body.timerDate具有与MongoDB中完全相同的月份datestring值,这应该工作。 (请参阅文档 )。

你必须使用string作为关键。 你不能在那里使用variables名。

 // Assuming that req.body.timerDate // has the month-date as stored in MongoDB (case-sensitive match) var reqDate = "data." + req.body.timerDate; var reqName = req.body.name; var _unset = {}; _unset[reqDate] = ""; mycollection.update({ name: reqName }, { $unset: _unset }) 

使用以下示例作为更新集合的指南。 您需要使用括号表示来创build查询和更新文档,即您需要具有以下结构的更新操作:

 db.mycollection.update( { 'name': 'PrakashPM' }, { '$unset': { 'data.Dec-2016': '' } } ) 

所以,使用这些variables来构build要在您的操作中使用的对象

 var mongoName = 'PrakashPM'; var timerDate = 'Dec-2016'; var query = {}; var update = {'$unset': {}}; query['name'] = mongoName; update['$unset']['data.'+timerDate] = ''; db.mycollection.update(query, update) 

您正试图将variables用作对象中的键。

 mycollection.update( { timerName: mongoName }, { $unset: {mongoDate : mongoVal} } ); 

这不符合你的期望,是一个通用的JavaScript概念(不是mongodb问题)。 您正在向mongo发送一个查询来更新一行,其中“timerName”键等于variables“mongoName”的内容。 但正确的关键是“名称”。

尝试这个:

 mycollection.update( { name: mongoName }, { $unset: {data : mongoVal} } );