MongoDB多层嵌套文档数组查询:如何匹配logs元素topics首项指定值
MongoDB查询实现方案
该需求完全可以实现,通过MongoDB聚合管道即可完成,具体实现步骤和代码如下:
1. 核心查询逻辑说明
- 预筛选阶段:仅保留
logs数组中存在至少一个元素的topics数组第一个值等于目标值的文档,减少后续计算量 - 数组过滤阶段:对符合条件的文档的
logs数组做过滤,仅保留满足topics第一个值等于目标值的元素
2. 具体查询代码(以目标值为CCC为例)
db.collection.aggregate([ // 预筛选符合条件的文档 { $match: { "logs.topics.0": "CCC" } }, // 过滤logs数组,仅保留符合要求的元素 { $project: { _id: 1, hash: 1, logs: { $filter: { input: "$logs", as: "logItem", cond: { $eq: ["$$logItem.topics.0", "CCC"] } } } } } ])
3. 返回结果示例
基于你提供的样例数据,上述查询的返回结果如下:
{ "_id": ObjectId("614e1b600146c86a7d5cb524"), "hash": "hash_1", "logs": [ { "address": "address_2", "topics": [ "CCC", "DDD" ] } ] }
补充说明
如果你需要保留文档的其他全部字段,仅修改logs数组,可以把$project替换为$addFields,避免手动罗列所有需要保留的字段:
{ $addFields: { logs: { $filter: { input: "$logs", as: "logItem", cond: { $eq: ["$$logItem.topics.0", "CCC"] } } } } }
内容的提问来源于stack exchange,提问作者kimiro
相关产品推荐
相关产品推荐

