MongoDb不支持带点的键。我有一个Ruby嵌套哈希,它有许多带有点(.)
字符的键。是否有一个配置可用于指定.
的字符替换,如下划线_
,同时将此类数据插入MongoDb
我正在使用MongoDB和Ruby& mongo
宝石。
示例哈希如下所示
{
"key.1" => {
"second.key" => {
"third.key" => "val"
}
}
}
答案 0 :(得分:2)
如果在Mongodb中无法使用.
的密钥,则必须修改输入数据:
hash = {
'key.1' => {
'second.key' => {
'third.key' => 'val.1',
'fourth.key' => ['val.1', 'val.2']
}
}
}
这个递归方法转换嵌套Hash的键:
def nested_gsub(object, pattern = '.', replace = '_')
if object.is_a? Hash
object.map do |k, v|
[k.to_s.gsub(pattern, replace), nested_gsub(v, pattern, replace)]
end.to_h
else
object
end
end
nested_gsub(hash)
返回:
{
"key_1" => {
"second_key" => {
"third_key" => "val.1",
"fourth_key" => [
"val.1",
"val.2"
]
}
}
}
可以在前一种方法中添加更多案例:
def nested_gsub(object, pattern = '.', replace = '_')
case object
when Hash
object.map do |k, v|
[k.to_s.gsub(pattern, replace), nested_gsub(v, pattern, replace)]
end.to_h
when Array
object.map { |v| nested_gsub(v, pattern, replace) }
when String
object.gsub(pattern, replace)
else
object
end
end
nested_gsub
现在将迭代字符串值和数组:
{
"key_1" => {
"second_key" => {
"third_key" => "val_1",
"fourth_key" => [
"val_1",
"val_2"
]
}
}
}
答案 1 :(得分:0)
在mongoDB中,没有配置支持密钥中的点。您需要在插入MongoDB集合之前预处理JSON。
一种方法是在插入之前用等效的U + FF0E替换点。
希望这有帮助。