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
])
在我的例子中,我的 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
])