使用mongoose更新嵌套数组中的现有项

时间:2016-06-06 11:43:43

标签: node.js mongodb mongoose

有一个如下所述的架构。我正在尝试更新现有的todo.task

问题是,我将路径存储为var done = 'todos.'+todoIndex+'.tasks.'+taskIndex+'.done',但它不起作用。我希望更新像todos.0.tasks.0.done:req.body.done,但它根本不起作用。

(todoIndex和taskIndex在存储索引值的字符串中)

这样做的正确方法是什么?

var mongoose = require('mongoose');

var todoSchema = {
    authorId : mongoose.Schema.Types.ObjectId,
    date:{
        type:Date
    },
    title : {
        type : String
    },
    description : {
        type : String
    },
    todos : [ {
        created : {
            type : Date
        },
        updated : {
            type : Date
        },
        title : {
            type : String
        },
        description : {
            type : String
        },
        done:{
            type:Boolean
        },
        deadline:{
            type:Date
        },
        tasks : [ {
            done : Boolean,
            task : String
        } ]
    } ]
}

module.exports = new mongoose.Schema(todoSchema);
module.exports.todoSchema = todoSchema;

我试图像这样建立Api:

api.put('/notebooks/todo/update/:pid',wagner.invoke(function(Todo,User){
        return function(req,res){
            var taskIndex=req.body.taskIndex;
            var todoIndex=req.body.todoIndex;
            var done = 'todos.'+todoIndex+'.tasks.'+taskIndex+'.done';
            console.log(done);
            Todo.update({_id:req.params.pid},{$set:{
                done : req.body.done,
            }}, function(err,done){
                console.log( done);
            })
    }}));

1 个答案:

答案 0 :(得分:1)

如果您使用的是最新的Node版本,则可以使用computed property name

Todo.update({ _id : req.params.pid }, { $set : { [ done ] : req.body.done } }, ...

否则,您需要使用中间对象:

var done  = 'todos.'+todoIndex+'.tasks.'+taskIndex+'.done';
var obj   = {};
obj[done] = req.body.done;
Todo.update({ _id : req.params.pid }, { $set : obj }, ...