MongoDB 键中包含特殊字符的查询

MongoDB query with special characters in key

在我的例子中,我的 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"
                }
            }}

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

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

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

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

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

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
])