将对象推送到Mongoose中的数组模式

时间:2013-03-25 18:21:34

标签: mongodb mongoose

我有这个猫鼬模式

var mongoose = require('mongoose');

var ContactSchema = module.exports = new mongoose.Schema({
  name: {
    type: String,
    required: true
  },
  phone: {
    type: Number,
    required: true,
    index: {unique: true}
  },
  messages: [
  {
    title: {type: String, required: true},
    msg: {type: String, required: true}
  }]
}, {
    collection: 'contacts',
    safe: true
});

并尝试通过执行此操作来更新模型:

Contact.findById(id, function(err, info) {
    if (err) return res.send("contact create error: " + err);

    // add the message to the contacts messages
    Contact.update({_id: info._id}, {$push: {"messages": {title: title, msg: msg}}}, function(err, numAffected, rawResponse) {
      if (err) return res.send("contact addMsg error: " + err);
      console.log('The number of updated documents was %d', numAffected);
      console.log('The raw response from Mongo was ', rawResponse);

    });
  });

我是不是声明messages取出一系列物体? 错误: MongoError:无法将$ push / $ pushAll修饰符应用于非数组

有什么想法吗?

2 个答案:

答案 0 :(得分:110)

mongoose在一次手术中为你做这件事。

Contact.findByIdAndUpdate(
    info._id,
    {$push: {"messages": {title: title, msg: msg}}},
    {safe: true, upsert: true},
    function(err, model) {
        console.log(err);
    }
);

请注意,使用此方法,您将无法使用架构" pre"功能。

http://mongoosejs.com/docs/middleware.html

截至最近的mogoose,findbyidandupdate需要有一个" new:true"添加了可选参数。否则,您将获得返回给您的旧文档。因此,Mongoose Version 4.x.x的更新转换为:

Contact.findByIdAndUpdate(
        info._id,
        {$push: {"messages": {title: title, msg: msg}}},
        {safe: true, upsert: true, new : true},
        function(err, model) {
            console.log(err);
        }
    );

答案 1 :(得分:2)

向数组中推送数据有两种方式

第一种方式:

let newMessage = {title: "new title", msg: "new Message"}
let result = await Contact.findById(id);
result.messages.push(newMessage);
await result.save();

第二种方式

let result = await Contact.findByIdAndUpdate(
        id,
        {$push: {"messages": {title: title, msg: msg}}},
        {upsert: true, new : true})