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

MongoDB/PyMongo使用aggregate检索嵌套数组的实现方法

MongoDB嵌套数组检索的聚合等价写法

场景说明

目标文档为二维数组嵌套结构,示例如下:

{
  "PRODUCT_NAME" : "Truffle Cake",
  "TAGS": [
            ["Cakes", 100],
            ["Flowers", 100],
       ]
}

原有find查询通过两层$elemMatch实现匹配规则:只要TAGS数组下任意子数组包含搜索关键词,就命中对应文档,原有效语句如下:

db.collection.find( {"TAGS":{"$elemMatch":{ "$elemMatch": {"$in":['search_text']} } }} )

可直接运行的聚合写法

MongoDB聚合管道的$match阶段完全兼容find方法的所有查询语法,不需要改写原有匹配规则,直接把原查询条件放入$match即可100%复现原find的匹配效果,不存在逻辑差异。

Mongo Shell 原生写法

db.collection.aggregate([
  // 与原find逻辑完全等价的匹配阶段
  {
    $match: {
      "TAGS": {
        "$elemMatch": {
          "$elemMatch": {
            "$in": ["search_text"] // 替换为实际搜索关键词
          }
        }
      }
    }
  }
  // 后续可直接追加$project、$group等其他聚合阶段满足业务需求
])

PyMongo 适配写法

PyMongo语法与Mongo Shell规则一致,仅需按照Python字典格式书写即可,无需额外转义:

from pymongo import MongoClient

# 替换为你的实际连接地址、库名、集合名
client = MongoClient("mongodb://localhost:27017/")
col = client["your_database"]["your_collection"]

search_keyword = "Cakes" # 替换为实际搜索词
pipeline = [
    {
        "$match": {
            "TAGS": {
                "$elemMatch": {
                    "$elemMatch": {
                        "$in": [search_keyword]
                    }
                }
            }
        }
    }
]

# 执行聚合查询获取结果
result = list(col.aggregate(pipeline))

可选扩展:同时过滤返回的TAGS子数组

如果不仅需要匹配符合条件的文档,还需要在返回结果中只保留命中关键词的TAGS子项,可在$match阶段后追加$set+$filter阶段:

// 追加到上述pipeline的$match阶段之后即可
{
  $set: {
    TAGS: {
      $filter: {
        input: "$TAGS",
        cond: {
          $in: ["search_text", "$$this"]
        }
      }
    }
  }
}

注意:该扩展阶段仅修改返回结果中TAGS字段的内容,不会改变文档匹配规则,和原find的命中逻辑完全一致。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 15:39:15