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);
}
);
这仍然搜索文档两次,不是吗? (一次为拉,一次为indexOf) 我觉得很奇怪mongoDB&mongoose不支持通过索引删除(这可以解决我的问题) 无论如何感谢。 –
@ClaasM。不,它不搜索两次,上述更新操作使用MongoDB的findAndModify()API查询集合一次,{new:false}选项返回回调中原始未修改的文档。 – chridam
我在说'IndexOf'。这似乎是没有必要查询someArray的submodel_id,然后使用'IndexOf'迭代someArray _again_来找到正确的索引。 –