将字段添加到对象Mongoose方式

时间:2018-02-09 22:01:04

标签: javascript node.js mongodb mongoose

我需要动态地将一个字段推送到我的数据库的对象“选项”。我使用Mongoose v.4.13.11。

我的架构

module.exports = mongoose.model('Model', 
{
   ...
   options: Object   
});

我在NodeJs中的后端 - 没有工作但在控制台日志中我有理想的结果:

controller.addingModels = (req, res) => {

    Model.findById(req.body._id).exec((err, model) => {
         model.options[req.body.name] = req.body.myvalue;
         model.set({
             options : model.options
         });
         console.log(model.options);
         model.save();
    });

};

控制台日志的输出是:

{ Maria : 25, John : 20, Perry : 31 }

但它没有在我的数据库中更新。 这里奇怪的是,当我手动添加值(见下文)时,它可以工作,数据库会执行更新并将其识别为对象:

         model.set({
             options : { Maria : 25, John : 20, Perry : 31 }
         });

为了动态工作,我该怎么办?如果您需要更多信息,请不要犹豫,问我。

2 个答案:

答案 0 :(得分:2)

您可以使用$set运算符。设置{new: true}将返回修改后的文档。

    model.options = {your new values} 

    Model.findByIdAndUpdate(req.body._id,{$set: {options : model.options}}, {new: true}, function(err, updatedDocument){
    console.log(updatedDocument);         
    model.save();
    });

答案 1 :(得分:0)

var mongoose = require('mongoose');
  var Schema = mongoose.Schema;

尝试像这样定义Schema, 考虑我想将动态字段添加到元对象。我可以这样做。

  var blogSchema = new Schema({
    title:  String,
    meta: {}
  });
blogsSchema.find(req.body._id).exec((err, blogData) => {
     blogData[0].meta[req.body.name] = req.body.myvalue;
     console.log(blogData[0].meta);
     blogData[0].save();
});