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

MongoDB中基于文档ID与多条件查询对象数组内元素

MongoDB 筛选指定文档数组内的匹配元素

需求说明

查询指定_id的文档中,toUsers数组内满足user等于指定ObjectId且visited: false的元素,或筛选该文档下所有visited: false的用户元素。


方法1:聚合管道(推荐,返回所有匹配元素)

通过聚合管道精准筛选数组中所有符合条件的元素,步骤如下:

  1. $match:定位目标文档
  2. $project + $filter:过滤数组内的匹配项

示例代码(多条件筛选)

假设目标文档_id为ObjectId("651548277423d019b0c251f6"),指定用户user为ObjectId("650167123cc7410860126076"):

db.collection.aggregate([
  {
    $match: {
      _id: ObjectId("651548277423d019b0c251f6")
    }
  },
  {
    $project: {
      toUsers: {
        $filter: {
          input: "$toUsers",
          cond: {
            $and: [
              { $eq: ["$$this.user", ObjectId("650167123cc7410860126076")] },
              { $eq: ["$$this.visited", false] }
            ]
          }
        }
      },
      _id: 0 // 可选,控制是否返回原文档ID
    }
  }
])

简化版(仅筛选visited为false的用户)

若无需限制user,仅筛选该文档下所有未访问的用户:

db.collection.aggregate([
  { $match: { _id: ObjectId("651548277423d019b0c251f6") } },
  {
    $project: {
      toUsers: {
        $filter: {
          input: "$toUsers",
          cond: { $eq: ["$$this.visited", false] }
        }
      },
      _id: 0
    }
  }
])

方法2:$elemMatch投影(仅返回第一个匹配元素)

如果只需要数组中第一个符合条件的元素,可使用$elemMatch进行投影:

db.collection.find(
  { _id: ObjectId("651548277423d019b0c251f6") },
  {
    toUsers: {
      $elemMatch: {
        user: ObjectId("650167123cc7410860126076"),
        visited: false
      }
    }
  }
)

注意:此方法仅返回数组中首个匹配元素,需所有匹配项优先使用聚合管道。


示例返回结果

针对提供的示例数据,聚合查询后将返回:

{
  "toUsers": [
    {
      "user": {"$oid": "650167123cc7410860126076"},
      "visited": false,
      "createdAt": {"$date": "2023-09-28T09:32:23.352Z"},
      "updatedAt": {"$date": "2023-09-28T09:32:23.352Z"}
    }
  ]
}

内容的提问来源于stack exchange,提问作者raju

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 04:35:59