【问题标题】:MongoDB query with special characters in key带有特殊字符的 MongoDB 查询
【发布时间】:2020-04-17 11:04:04
【问题描述】:

在我的例子中,我的 MongoDB 数据库中有键,它们的名称中包含一个点(参见随附的屏幕截图)。我已经读到可以通过这种方式将数据存储在 MongoDB 中,但是驱动程序会阻止使用键中的点进行查询。无论如何,在我的 MongoDB 数据库中,键确实包含点,我必须使用它们。

我现在尝试对查询中的点进行编码(. 到 \u002e),但它似乎不起作用。然后我有了使用正则表达式的想法,用任何字符替换查询中的点,但正则表达式似乎只适用于值而不适用于键。

有没有人有创意如何解决这个问题?例如,我想获得“cve_results.BusyBox 1.12.1”的所有 CVE 编号。

更新 #1: cve_results的结构如下:

"cve_results" : {
            "BusyBox 1.12.1" : {
                "CVE-2018-1000500" : {
                    "score2" : "6.8",
                    "score3" : "8.1",
                    "cpe_version" : "N/A"
                },
                "CVE-2018-1000517" : {
                    "score2" : "7.5",
                    "score3" : "9.8",
                    "cpe_version" : "N/A"
                }
            }}

【问题讨论】:

    标签: regex mongodb mongodb-query special-characters


    【解决方案1】:

    通过以下解决方法,我能够通过他们的密钥直接访问文档,即使他们的密钥中有一个点:

    db.getCollection('mycollection').aggregate([
    {$match: {mymapfield: {$type: "object" }}}, //filter objects with right field type
    {$project: {mymapfield: { $objectToArray: "$mymapfield" }}}, //"unwind" map to array of {k: key, v: value} objects
    {$match: {mymapfield: {k: "my.key.with.dot", v: "myvalue"}}} //query
    ])
    

    【讨论】:

      【解决方案2】:

      如果可能,值得使用\u002e 而不是点来插入文档,这样您就可以查询它们,同时保留. 的ASCII 值用于任何客户端渲染。

      但是,似乎有一种解决方法可以像这样查询它们:

      db.collection.aggregate({ 
          $match: {
              "BusyBox 1.12.1" : "<value>"
          }
      })
      

      【讨论】:

      • 很遗憾,cve_results 不是一个字段。我已经更新了问题并添加了 cve_results 的结构。
      • @Lisa 所以 cve_results 是集合名称吗?我已经更改了我的代码,请尝试一下?
      • 其实上层结构只是一个文档的sn-p。完整路径为 processes_analysis.cve_lookup.cve_results,集合名为 file_objects。在您的解决方案中,查询会传递一个特定值(例如“CVE-2011-2716”)。但我想查询所请求软件的所有 CVE 编号,而不在查询中给出具体值。
      【解决方案3】:

      您应该能够使用$eq operator 来查询名称中带有点的字段。

      【讨论】:

        猜你喜欢
        • 2012-03-23
        • 2017-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-18
        • 2018-05-15
        • 1970-01-01
        相关资源
        最近更新 更多