Mongodb在插入文档时替换键名中的点(。)

时间:2017-01-08 03:59:02

标签: ruby mongodb

MongoDb不支持带点的键。我有一个Ruby嵌套哈希,它有许多带有点(.)字符的键。是否有一个配置可用于指定.的字符替换,如下划线_,同时将此类数据插入MongoDb

我正在使用MongoDB和Ruby& mongo宝石。

示例哈希如下所示

{
  "key.1" => {
             "second.key" => {
                             "third.key" => "val"
                           }
             }
}

2 个答案:

答案 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替换点。

希望这有帮助。