2017-02-11 13 views
0

我是新来的MongoDB和猫鼬。带有ObjectId数组的文档 - 推送值(如果存在),删除否则删除

所以我的模型拥有许多领域,在他们之中是的ObjectID

数组
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

我相信你可以做到这一点使用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 
} 
+0

有与做这种方式,在回调函数一个问题 - “inner_object_id”变量是不确定的。它被定义之前 – Moka

+0

好吧,我似乎已经通过使用.bind() – Moka

+0

变量很高兴我可以帮助。 –