如何在MongoDB中基于其他查询结果执行删除操作?
MongoDB 基于查询结果的删除操作解决方案
首先修正你提供的示例数据的语法错误(引号和键名格式问题),正确格式如下:
[ { "hash": "12312521", "done": false, "type": "bla" }, { "hash": "12312521", "done": true, "type": "bla" } ]
按你的操作步骤实现(删除done=true且hash存在于done=false集合的文档)
方法一:分两步执行(Mongo Shell)
- 查询所有
done=false的hash值并存储
// 替换 collectionName 为你的实际集合名称 const targetHashes = db.collectionName.find( { done: false }, { hash: 1, _id: 0 } // 只返回hash字段,排除_id ).map(doc => doc.hash);
- 使用获取到的hash列表删除目标文档
db.collectionName.deleteMany({ done: true, hash: { $in: targetHashes } // 匹配hash在目标列表中的文档 });
执行后,示例中的第二个文档(done=true)会被删除。
方法二:单步聚合式删除(MongoDB 4.2+ 支持,更高效)
无需单独存储hash列表,直接在删除条件中嵌套查询:
db.collectionName.deleteMany({ $expr: { $and: [ { $eq: ["$done", true] }, // 直接查询所有done=false的hash并匹配当前文档的hash { $in: ["$hash", db.collectionName.distinct("hash", { done: false })] } ] } });
若你预期删除第一个文档(done=false且存在相同hash的done=true文档)
如果你的实际需求是删除那些done=false且对应hash存在done=true文档的记录,可使用以下命令:
db.collectionName.deleteMany({ $expr: { $and: [ { $eq: ["$done", false] }, { $in: ["$hash", db.collectionName.distinct("hash", { done: true })] } ] } });
执行后,示例中的第一个文档会被删除,符合你描述的预期结果。
内容的提问来源于stack exchange,提问作者Gal Sosin
相关产品推荐
相关产品推荐

