【问题标题】:Is there a way to find key fields that cointain a specific substring in MongoDB?有没有办法在 MongoDB 中找到包含特定子字符串的关键字段?
【发布时间】:2021-09-30 19:06:25
【问题描述】:

我研究了许多解决方案,但所有解决方案都包括在 字段值 中查找子字符串。我有一个包含超过 3M 文档的集合,其中一些具有日期字段,但不是全部,也不是每个字段的数量都相同。例如,一个可能有 "FirstDate""LastDate",其他可能只包含 "Date",而其他可能不包含 任何日期字段

我想要做的是查询所有在其字段键中具有单词/子字符串“日期”的文档。换句话说,查询所有包含 substr "date" 的关键字段。例如:

db.collection.find({ *date* : { $exists : true } })
   .projection({})
   .sort({_id:-1})

(我知道 * 是错误的,但这只是为了说明)

我尝试过使用.find().aggregate()$regex,但我尝试过的所有语法都毫无意义...

【问题讨论】:

    标签: mongodb find key document substr


    【解决方案1】:

    这可以通过使用聚合管道来实现。假设您的收藏如下所示:

    [
      {
        "_id": 1,
        property: true,
        
      },
      {
        "_id": 2,
        firstDate: "First date"
      },
      {
        "_id": 3,
        lastDate: "Last name"
      },
      {
        "_id": 4,
        date: "date"
      },
      {
        "_id": 5,
        property: true
      },
      {
        "_id": 6,
        name: "Name"
      }
    ]
    

    首先,您必须创建一个包含键和值数组的属性,以便稍后按键进行过滤。这可以通过在$addFields 中使用$objectToArray 来完成。

    db.collection.aggregate([
      {
        $addFields: {
          keysAndValues: {
            $objectToArray: "$$ROOT",
          }
        }
      }
    ]);
    

    如果您将$$ROOT 传递给它,您将创建一个包含所有文档键和值的数组。因此,此时您的数据将如下所示:

    [
      {
        "_id": 1,
        "keysAndValues": [
          {
            "k": "_id",
            "v": 1
          },
          {
            "k": "property",
            "v": true
          }
        ],
        "property": true
      },
    
      ...
    
      {
        "_id": 6,
        "keysAndValues": [
          {
            "k": "_id",
            "v": 6
          },
          {
            "k": "name",
            "v": "Name"
          }
        ],
        "name": "Name"
      }
    ]
    

    所以你现在可以添加一个$match 阶段,使用$regex 来按如下键进行过滤:

    db.collection.aggregate([
      {
        $addFields: {
          keysAndValues: {
            $objectToArray: "$$ROOT",
            
          }
        }
      },
      {
        $match: {
          "keysAndValues.k": {
            $regex: "date",
            $options: "i",
            
          }
        }
      }
    ]);
    

    此时,您已经获得了所需的结果,所有在键中包含单词date 的文档,然后您可以取消设置您创建的属性以使过滤成为可能,keysAndValues,以清理数据。

    db.collection.aggregate([
      {
        $addFields: {
          keysAndValues: {
            $objectToArray: "$$ROOT",
            
          }
        }
      },
      {
        $match: {
          "keysAndValues.k": {
            $regex: "date",
            $options: "i",
            
          }
        }
      },
      { $unset: 'keysAndValues' },
    ]);
    

    在此之后,您的最终结果将是:

    [
      {
        "_id": 2,
        "firstDate": "First date"
      },
      {
        "_id": 3,
        "lastDate": "Last name"
      },
      {
        "_id": 4,
        "date": "date"
      }
    ]
    

    您可以在这个操场上看到一个工作示例: https://mongoplayground.net/p/U5FjTOVQIwb

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-18
      • 2020-04-17
      • 2014-06-07
      • 2020-09-10
      • 2021-02-10
      • 2013-04-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多