MongoDB中基于文档ID与多条件查询对象数组内元素
MongoDB 筛选指定文档数组内的匹配元素
需求说明
查询指定_id的文档中,toUsers数组内满足user等于指定ObjectId且visited: false的元素,或筛选该文档下所有visited: false的用户元素。
方法1:聚合管道(推荐,返回所有匹配元素)
通过聚合管道精准筛选数组中所有符合条件的元素,步骤如下:
$match:定位目标文档$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
相关产品推荐
相关产品推荐

