猫鼬更新,对数组进行推送操作并对对象进行设置操作

mongoose update with push operations on array and set operation on object

我有这个猫鼬模式

var ContactSchema = module.exports = new mongoose.Schema({
  name: {
    type: String,
    required: true
  },
  phone: {
    type: Number,
    required: true,
  },
  messages: [
  {
    title: {type: String, required: true},
    msg: {type: String, required: true}
  }],
  address:{ city:String,
            state:String
  }
});

我最初的集合集名称和 phone 字段。我需要将新消息更新到消息数组中,并将新地址更新到地址对象中。该函数还必须需要处理任何单个操作,即在某些情况下我只更新消息数组或更新名称和地址。那么我怎样才能在一个函数中完成所有操作。

        var messages= {
            title: req.body.title,
            msg: req.body.msg
        }
        Model.findOneAndUpdate({'_id': req.body.id,},{$push: {messages:message}},{upsert: true}, function (err, data) {
            if (err) {
                return res.status(500).send(err);
            }
            if (!data) {
                return res.status(404).end();
            }
            return res.status(200).send(data);
        });

您可以尝试在更新对象中同时使用 $set and $push 运算符。例如,假设您想在一个操作中同时更新名称和地址字段,请在名称字段上使用 $set 并对地址数组使用 $push 操作:

var messages= {
    title: req.body.title,
    msg: req.body.msg
},
query = {'_id': req.body.id},
update = {
    $set: {name: req.body.name},
    $push: {messages: message}
},
options = {upsert: true};

Model.findOneAndUpdate(query, update, options, function (err, data) {
    if (err) {
        return res.status(500).send(err);
    }
    if (!data) {
        return res.status(404).end();
    }
    return res.status(200).send(data);
});