通过数组上的推送操作和对象上的设置操作进行mongoose更新

时间:2015-03-27 13:59:00

标签: arrays node.js mongodb mongoose

我有这个猫鼬模式

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
  }
});

我最初拥有名称和电话字段的收藏集。我需要将带有新消息的集合更新为messages数组,将新地址更新为address对象。该函数还必须处理任何单个操作,即在某些情况下,我只更新消息数组或更新名称和地址。所以我怎么能在一个功能中完成所有操作。

        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);
        });

1 个答案:

答案 0 :(得分:13)

您可以尝试在更新对象中同时使用$set$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);
});