如何使用Mongoose向对象添加字段?

时间:2015-11-21 22:38:41

标签: node.js mongodb mongoose

我正在使用MEAN堆栈构建一个CRUD应用程序,并且我设置了一个带有空对象的Mongoose模式(Freezer):

shelves: {}

我正在尝试将其他对象推送到此对象,例如:

[shelfname] : {name : [shelfname]}

因此,随着时间的推移,货架对象将类似于:

shelves : {

           shelf1: {name: shelf1},
           shelf2: {name: shelf2},
           shelf3: {name: shelf3},


}

我正在尝试以下代码并且它无法正常工作:

var shelf = req.body.shelf
  console.log(shelf);
  var shelfname = req.body.shelf.shelfname;


  var conditions = {_id : req.body._id};

  var update = {$set: {shelfname : shelfname}};

  Freezer.update(conditions, update, function(err,freezer){
    console.log(freezer);




  });

我将如何做到这一点?

1 个答案:

答案 0 :(得分:0)

我建议您使用一系列子文档来存放冰箱:

var FreezerModel = new Schema({
    shelves: [String]
});

然后使用$push运算符将货架添加到冰箱:

var shelf = req.body.shelf,
    id = req.body._id;
Freezer.update({_id: id}, {$push: {shelves: shelf}}, function(err, freezer) {
    console.log(freezer);
});

如果你想坚持使用对象而不是数组,我建议你使用数组表示法修改字段:

var FreezerModel = new Schema({
    shelves: Schema.Types.Mixed
});

var update = {$set: {}};
update['$set']['shelves.'+shelfname] = shelfname;

这是因为在js对象表示法中,键总是被解释为文字,因此如果要将变量用于键,则需要使用数组表示法。 对Mixed使用shelves类型是由于严格模式下的Mongoose将您限制在架构中定义的字段。您还可以使用{strict:false}作为架构选项。有关详细信息,请参阅this issue