Doc with ObjectId Array - 如果存在则推送值,否则删除

时间:2017-02-11 13:59:27

标签: arrays node.js mongodb mongoose

我是MongoDB和mongoose的新手。

所以我的模型包含很多字段,其中有一个ObjectIDs数组

var modelSchema = new Schema({
    //...
    inner_array: [Schema.Types.ObjectId],
    //...
});

我想通过查询实现的目标是:

通过它的ID来查找模型,

如果内部数组包含特定值,则将其从数组中删除。

如果值不在inner_array中,请按

var target_id = // document id
var inner_object_id = // value to push

models.MyModel.findOne(
    {_id: target_id},
    function (err, model) {
    // IN THIS SCOPE 'INNER_OBJECT_ID' IS UNDEFINED

    // if model.inner_array contains 'inner_object_id', remove it
    // otherwise, push 'inner_object_id' into model.inner_array

    model.save();
    res.json(model); // return modified document to client
    }
);

我相信这可以写在一个findOneAndUpdate中,但我无法弄清楚语法..

非常感谢!

1 个答案:

答案 0 :(得分:1)

我相信您可以使用MongooseArray.pullMongooseArray.addToSet

来实现这一目标
var target_id = // document id
var inner_object_id = // value to push

models.MyModel.findOne({
  _id: target_id
}, function (err, model) {
  if (model.inner_array.indexOf(inner_object_id) !== -1) {
    model.inner_array.pull(inner_object_id);
  } else {
    model.inner_array.addToSet(inner_object_id);
  }
  model.save();
  res.json(model); // return modified document to client
}