如何使用嵌入数组

时间:2017-01-11 04:52:15

标签: mongodb express typescript

我正在尝试学习如何使用mongo查询深入到数据树。具体来说,我正在尝试删除{"object": 'to remove'}

下面的对象
{
    "_id" : ObjectId("7840f22736341b09154f7ebf"),
    "username" : "nmay",
    "fname" : "Nate",
    "lname" : "May",
    "data" : [ 
        {
            "monthNum" : 1,
            "year" : 2016,
            "days" : [ 
                {
                    "date" : "2016-01-01T06:00:00.000Z",
                    "type1" : [],
                    "type2" : []
                }, 
                {
                    "date" : "2016-01-02T06:00:00.000Z",
                    "type1" : [
                       {"object": 'to remove'}
                    ],
                    "type2" : []
                }
            ]
        }
    ]
}

到目前为止,我知道如何查询用户_id,但我不知道如何使用每个数组中的索引删除所需的对象。在此示例中,我想删除data[0].days[1].type1[0]

这是我到目前为止的查询:

app.delete('/user/:id/data/:monthIndex/days/:dayIndex/type1/:type1Index', function (req, res, next) {
  var monthIndex = parseInt(req.params.monthIndex); // these console the value properly
  var dayIndex = parseInt(req.params.dayIndex); // -1 is applied to the parameter to translate to array position
  var type1Index = parseInt(req.params.type1Index);

  db.users.update(
     { _id: mongojs.ObjectId(req.params.id) },
     { $pull: data.monthIndex.days.dayIndex.type1.type1Index }
   );
}

它给了我错误

  

ReferenceError:未定义数据

有人可以演示如何通过此查询传递我的索引参数以删除所需的对象吗?

1 个答案:

答案 0 :(得分:1)

不幸的是,没有办法通过MongoDB中的单个操作通过其数字索引删除数组元素。为此,您需要先取消设置所需的元素,然后删除生成的null值字段。

您的代码应如下所示:

db.users.update(
    { _id : mongojs.ObjectId(req.params.id) },
    { $unset : { 'data.0.days.1.type1.0' : 1 } }
);
db.users.update(
    { _id : mongojs.ObjectId(req.params.id) },
    { $pull : { 'data.0.days.1.type1' : null } }
);

由@bob编辑:传递你必须构建查询字符串的参数,这很难看:

var unset = {};
unset['$unset'] = {};
unset.$unset['data.' + req.params.monthIndex + '.days.' + req.params.dayIndex + '.foods.' + req.params.foodIndex] = 1;

db.users.update( { _id : mongojs.ObjectId(req.params.id) }, unset );

var pull = {};
pull['$pull'] = {};
pull.$pull['data.' + req.params.monthIndex + '.days.' + req.params.dayIndex + '.foods'] = null;

db.users.update( { _id : mongojs.ObjectId(req.params.id) }, pull );