You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MongoDB中基于其他查询结果执行删除操作?

MongoDB 基于查询结果的删除操作解决方案

首先修正你提供的示例数据的语法错误(引号和键名格式问题),正确格式如下:

[
  {
    "hash": "12312521",
    "done": false,
    "type": "bla"
  },
  {
    "hash": "12312521",
    "done": true,
    "type": "bla"
  }
]

按你的操作步骤实现(删除done=true且hash存在于done=false集合的文档)

方法一:分两步执行(Mongo Shell)

  1. 查询所有done=false的hash值并存储
// 替换 collectionName 为你的实际集合名称
const targetHashes = db.collectionName.find(
  { done: false }, 
  { hash: 1, _id: 0 } // 只返回hash字段,排除_id
).map(doc => doc.hash);
  1. 使用获取到的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 20:24:22