MongoDB&Mongoose:如何在使用pull时获取删除项目的索引?

问题描述:

我必须从文档中的子模板数组中移除项目。MongoDB&Mongoose:如何在使用pull时获取删除项目的索引?

SubSchema = new mongoose.Schema({...}) 
MySchema = new mongoose.Schema({someArray: [SubSchema]}) 
(...) 
mydoc.somearray.pull(req.body.submodel_id); 

不过,我需要的是已被删除,通知所有连接的客户端的元素的索引。

有没有一个优雅的解决方案,或者我必须使用_.findIndex或类似的东西? (我想,有更糟糕的表现,因为它不必要地遍历数组两次)

不知道一个优雅的解决方案存在这是MongoDB的没有返回数组元素 的索引更新操作中被拉的方式。一种方法(尽管我认为这是一个肮脏的黑客攻击)将获得更新操作后的原始 阵列,并在更新回调中使用Array.indexOf()获取删除的元素索引。

考虑使用findOneAndUpdate()得到更新文档以下更新操作:

var submodel_id = req.body.submodel_id, 
    query = { "someArray": submodel_id }; 

Model.findOneAndUpdate(
    query, 
    { "$pull": { "someArray": submodel_id } }, 
    { "new": false }, 
    function(err, doc) { 
     var removedIndex = doc.someArray.indexOf(submodel_id); 
     console.log(removedIndex); 
    } 
); 
+0

这仍然搜索文档两次,不是吗? (一次为拉,一次为indexOf) 我觉得很奇怪mongoDB&mongoose不支持通过索引删除(这可以解决我的问题) 无论如何感谢。 –

+0

@ClaasM。不,它不搜索两次,上述更新操作使用MongoDB的findAndModify()API查询集合一次,{new:false}选项返回回调中原始未修改的文档。 – chridam

+0

我在说'IndexOf'。这似乎是没有必要查询someArray的submodel_id,然后使用'IndexOf'迭代someArray _again_来找到正确的索引。 –