首页 > 解决方案 > 如何过滤mongodb文档中的字符串数组?

问题描述

我有多个看起来像这样的 mongodb 文档

    {
    "_id": "001",
    "car_description": "Audi",
    "sales": [
        "India/Mumbai",
        "India/Delhi",
        "India/Chennai",
        "India/Kolkata",
        "US/NYC",
        "US/SF"]
   },
   {
    "_id": "002",
    "car_description": "BMW",
    "sales": [
        "India/Mumbai",
        "India/Delhi",
        "India/Chennai",
        "India/Kolkata",
        "US/NYC",
        "US/SF"]
}

我正在努力获得car_description在印度发生的销售情况。最终输出应该是这样的。

{
  {
   "car_description": "Audi",
   "sales": [
        "India/Mumbai",
        "India/Delhi",
        "India/Chennai",
        "India/Kolkata"]
  },
  {
    "car_description": "BMW",
    "sales": [
        "India/Mumbai",
        "India/Delhi",
        "India/Chennai",
        "India/Kolkata"]
  }
}

编辑:我尝试使用它,但这并没有过滤掉销售。相反,它给出了一条错误消息“无法识别的表达式'$regexMatch”

db.collection.aggregate([
  {
    "$project": {
      "car_description": 1,
      "sales": 1,
      "sales": {
        "$filter": {
          "input": "$sales",
          "as": "sale",
          "cond": {
            $regexMatch: {
              input: "$$sale",
              regex: "India",
              options: "i"
            }
          }
        }
      }
    }
  }
])

标签: mongodbmongodb-query

解决方案


查看此代码段,看看它是否满足您的需求:

db.sales.find({
  "sales": {
    $elemMatch: {
      $regex: "^India\/",
      $options: "i"
    }
  }
},
{
  "car_description": 1,
  "sales": 1
})

https://mongoplayground.net/p/61sqeMXU_yg

编辑:如果您想filter排除与表达式不匹配的所有区域,regex您可以尝试以下aggregate查询:

MongoDB >= 4.1.11

db.sales.aggregate([
  {
    $match: {
      "sales": {
        $elemMatch: {
          $regex: "^India\/",
          $options: "i"
        }
      }
    }
  },
  {
    $set: {
      sales: {
        $filter: {
          input: "$sales",
          as: "sale",
          cond: {
            $regexMatch: {
              input: "$$sale",
              regex: "^India\/",
              options: "i"
            }
          }
        }
      }
    }
  }
])

https://mongoplayground.net/p/NGDSVQeXtRI

较旧的 MongoDB 版本

db.collection.aggregate([
  {
    $match: {
      "sales": {
        $elemMatch: {
          $regex: "^India\/",
          $options: "i"
        }
      }
    }
  },
  {
    $set: {
      sales: {
        $filter: {
          input: "$sales",
          as: "sale",
          cond: {
            $eq: [
              {
                $toLower: {
                  $arrayElemAt: [
                    {
                      $split: [
                        "$$sale",
                        "/"
                      ]
                    },
                    0
                  ]
                }
              },
              "india"
            ]
          }
        }
      }
    }
  }
])

https://mongoplayground.net/p/19TARSVTaMN


推荐阅读