在对象数组中搜索MongoDb RegEx

nnsrf1az  于 12个月前  发布在  Go
关注(0)|答案(1)|浏览(135)

我的集合中有一个现有的数据结构,基本上看起来像这样(简化):

[
  { items: [
    { id: '000', value: 'string' },
    { id: '001', value: 1234 },
    { id: '002', value: true },
    ...
  ] },
  { items: [
    { id: '000', value: 'another string' },
    { id: '001', value: 2345 },
    { id: '002', value: false },
    ...
  ] },
  ...
]

字符串
现在我想搜索某些id s的值(由用户动态选择),匹配正则表达式(由用户输入并正确转义,实际上只搜索子字符串)。由于我需要提取上述id s的值,我使用以$match开始的聚合管道:

{ $match: {
    items: { $elemMatch: {
        item_id: { $in: ['000', '002'] },
        item_data: { $regex: 'e', $options: 'i' }
    } }
} }


我期望两个文档都返回-第一个是由于'true'中匹配的'e',第二个是由于'another'中匹配的'e'。但我意识到$regex运算符只对字符串值有效,而忽略所有其他类型。我想要的是将其他类型转换为字符串(通过$toString或类似的东西),所以我也可以搜索数字和其他数据类型。这可能使用$elemMatch还是我需要另一个运算符?

ojsjcaue

ojsjcaue1#

$or条件放入$map中,以生成一个布尔数组。然后使用$anyElementTrue返回整个文档。您可以将整个文档 Package 在$expr中,然后将其放入find中。是的,您将需要$toString将非字符串value字段转换为$regexMatch

db.collection.find({
  "$expr": {
    "$anyElementTrue": {
      "$map": {
        "input": "$items",
        "as": "i",
        "in": {
          "$or": [
            {
              "$in": [
                "$$i.id",
                [
                  "000",
                  "002"
                ]
              ]
            },
            {
              "$regexMatch": {
                "input": {
                  "$toString": "$$i.value"
                },
                "regex": "e",
                "options": "i"
              }
            }
          ]
        }
      }
    }
  }
})

字符串
Mongo Playground

相关问题