MongoDB Node JS - 从文档对象内的对象中删除条目

时间:2017-01-24 10:39:27

标签: javascript node.js mongodb mongoose

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

我有一个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请求函数中执行上述操作。

我为输入值(mongoDate,mongoVal)尝试了许多可能的方式(TRIALS),但我无法达到以下结果。

此外,是否可以通过使用密钥删除键值对条目? (即在这种情况下{$ 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"
             }
    }

3 个答案:

答案 0 :(得分:1)

假设req.body.timerDate的月 - 日期字符串值与MongoDB完全相同,这应该可行。 (见documentation)。

您必须使用字符串作为键。你不能在那里使用变量名。

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

答案 1 :(得分:1)

使用以下示例作为更新集合的指南。您需要使用bracket notation来创建查询并更新文档,即您需要具有以下结构的更新操作:

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

因此,使用变量构造要在操作中使用的对象

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

db.mycollection.update(query, update)

答案 2 :(得分:0)

您正在尝试将变量用作对象中的键。

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

这不会像您期望的那样工作,并且是一般的JavaScript概念(不是mongodb问题)。 您正在向mongo发送查询以更新其中“timerName”键等于变量“mongoName”的内容的行。 但正确的关键是“名字”。

试试这个:

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