質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.76%

  • Ruby on Rails

    6753questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

  • MongoDB

    236questions

    MongoDBはオープンソースのドキュメント指向データベースの1つです。高性能で、多くのリトルエンディアンシステムを利用することができます。

Mongoidでkeyにドットが含まれるjson形式のデータを格納する際にエラーが発生する

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 200

ykomuro0719

score 1

前提・実現したいこと

Mongoidでkeyにドットが含まれる階層構造のJsonデータを格納したい

発生している問題・エラーメッセージ

Mongoidを利用してRailsに複数階層ネストしたJsonデータを格納しようと考え、
下記の形で設定しbundle exec rails db:seedを実施するとエラーが発生します。

```b  
$ bundle exec rails db:seed  
rails aborted!  
BSON::String::IllegalKey: '127.0.0.1' is an illegal key in MongoDB. Keys may not start with '$' or contain a '.'.  
/es-webui/vender/bundle/ruby/2.3.0/gems/bson-4.3.0.beta/lib/bson/hash.rb:42:in `put_hash'
/es-webui/vender/bundle/ruby/2.3.0/gems/bson-4.3.0.beta/lib/bson/hash.rb:42:in `to_bson'  
/es-webui/vender/bundle/ruby/2.3.0/gems/mongo-2.5.0.beta/lib/mongo/protocol/serializers.rb:326:in `serialize'
/es-webui/vender/bundle/ruby/2.3.0/gems/mongo-2.5.0.beta/lib/mongo/protocol/message.rb:241:in `block in serialize_fields'  
/es-webui/vender/bundle/ruby/2.3.0/gems/mongo-2.5.0.beta/lib/mongo/protocol/message.rb:229:in `each'
/es-webui/vender/bundle/ruby/2.3.0/gems/mongo-2.5.0.beta/lib/mongo/protocol/message.rb:229:in `serialize_fields'  
/es-webui/vender/bundle/ruby/2.3.0/gems/mongo-2.5.0.beta/lib/mongo/protocol/message.rb:125:in `serialize'
/es-webui/vender/bundle/ruby/2.3.0/gems/mongo-2.5.0.beta/lib/mongo/server/connection.rb:229:in `block in write'  
/es-webui/vender/bundle/ruby/2.3.0/gems/mongo-2.5.0.beta/lib/mongo/server/connection.rb:228:in `each'
/es-webui/vender/bundle/ruby/2.3.0/gems/mongo-2.5.0.beta/lib/mongo/server/connection.rb:228:in `write'  
/es-webui/vender/bundle/ruby/2.3.0/gems/mongo-2.5.0.beta/lib/mongo/server/connection.rb:195:in `deliver'
/es-webui/vender/bundle/ruby/2.3.0/gems/mongo-2.5.0.beta/lib/mongo/server/connection.rb:126:in `block in dispatch'  
/es-webui/vender/bundle/ruby/2.3.0/gems/mongo-2.5.0.beta/lib/mongo/monitoring/publishable.rb:47:in `publish_command'
/es-webui/vender/bundle/ruby/2.3.0/gems/mongo-2.5.0.beta/lib/mongo/server/connection.rb:125:in `dispatch'  
/es-webui/vender/bundle/ruby/2.3.0/gems/mongo-2.5.0.beta/lib/mongo/operation/write/command/writable.rb:40:in `block in execute'
/es-webui/vender/bundle/ruby/2.3.0/gems/mongo-2.5.0.beta/lib/mongo/server/connection_pool.rb:107:in `with_connection'  
/es-webui/vender/bundle/ruby/2.3.0/gems/mongo-2.5.0.beta/lib/mongo/server.rb:250:in `with_connection'
/es-webui/vender/bundle/ruby/2.3.0/gems/mongo-2.5.0.beta/lib/mongo/operation/write/command/writable.rb:39:in `execute'  
/es-webui/vender/bundle/ruby/2.3.0/gems/mongo-2.5.0.beta/lib/mongo/operation/write/insert.rb:55:in `execute_write_command'
/es-webui/vender/bundle/ruby/2.3.0/gems/mongo-2.5.0.beta/lib/mongo/operation/write/write_command_enabled.rb:50:in `execute'  
/es-webui/vender/bundle/ruby/2.3.0/gems/mongo-2.5.0.beta/lib/mongo/collection.rb:430:in `block (2 levels) in insert_one'
/es-webui/vender/bundle/ruby/2.3.0/gems/mongo-2.5.0.beta/lib/mongo/retryable.rb:106:in `write_with_retry'  
/es-webui/vender/bundle/ruby/2.3.0/gems/mongo-2.5.0.beta/lib/mongo/collection.rb:420:in `block in insert_one'
/es-webui/vender/bundle/ruby/2.3.0/gems/mongo-2.5.0.beta/lib/mongo/client.rb:449:in `with_session'  
/es-webui/vender/bundle/ruby/2.3.0/gems/mongo-2.5.0.beta/lib/mongo/collection.rb:419:in `insert_one'
/es-webui/vender/bundle/ruby/2.3.0/gems/mongoid-7.0.0.beta/lib/mongoid/query_cache.rb:182:in `insert_one_with_clear_cache'  
/es-webui/vender/bundle/ruby/2.3.0/gems/mongoid-7.0.0.beta/lib/mongoid/persistable/creatable.rb:79:in `insert_as_root'
/es-webui/vender/bundle/ruby/2.3.0/gems/mongoid-7.0.0.beta/lib/mongoid/persistable/creatable.rb:27:in `block in insert'  
/es-webui/vender/bundle/ruby/2.3.0/gems/mongoid-7.0.0.beta/lib/mongoid/persistable/creatable.rb:118:in `block (2 levels) in prepare_insert'
/es-webui/vender/bundle/ruby/2.3.0/gems/activesupport-5.1.4/lib/active_support/callbacks.rb:131:in `run_callbacks'  
/es-webui/vender/bundle/ruby/2.3.0/gems/mongoid-7.0.0.beta/lib/mongoid/interceptable.rb:132:in `run_callbacks'
/es-webui/vender/bundle/ruby/2.3.0/gems/mongoid-7.0.0.beta/lib/mongoid/persistable/creatable.rb:117:in `block in prepare_insert'  
/es-webui/vender/bundle/ruby/2.3.0/gems/activesupport-5.1.4/lib/active_support/callbacks.rb:97:in `run_callbacks'
/es-webui/vender/bundle/ruby/2.3.0/gems/mongoid-7.0.0.beta/lib/mongoid/interceptable.rb:132:in `run_callbacks'  
/es-webui/vender/bundle/ruby/2.3.0/gems/mongoid-7.0.0.beta/lib/mongoid/persistable/creatable.rb:116:in `prepare_insert'
/es-webui/vender/bundle/ruby/2.3.0/gems/mongoid-7.0.0.beta/lib/mongoid/persistable/creatable.rb:23:in `insert'  
/es-webui/vender/bundle/ruby/2.3.0/gems/mongoid-7.0.0.beta/lib/mongoid/persistable/savable.rb:23:in `save'
/es-webui/vender/bundle/ruby/2.3.0/gems/mongoid-7.0.0.beta/lib/mongoid/persistable/creatable.rb:149:in `block in create'  
/es-webui/vender/bundle/ruby/2.3.0/gems/mongoid-7.0.0.beta/lib/mongoid/threaded/lifecycle.rb:161:in `_creating'
/es-webui/vender/bundle/ruby/2.3.0/gems/mongoid-7.0.0.beta/lib/mongoid/persistable/creatable.rb:144:in `create'  
/es-webui/db/seeds.rb:19:in `block in <top (required)>'
/es-webui/db/seeds.rb:16:in `each'  
/es-webui/db/seeds.rb:16:in `<top (required)>'
/es-webui/vender/bundle/ruby/2.3.0/gems/activesupport-5.1.4/lib/active_support/dependencies.rb:286:in `load'  
/es-webui/vender/bundle/ruby/2.3.0/gems/activesupport-5.1.4/lib/active_support/dependencies.rb:286:in `block in load'
/es-webui/vender/bundle/ruby/2.3.0/gems/activesupport-5.1.4/lib/active_support/dependencies.rb:258:in `load_dependency'  
/es-webui/vender/bundle/ruby/2.3.0/gems/activesupport-5.1.4/lib/active_support/dependencies.rb:286:in `load'
/es-webui/vender/bundle/ruby/2.3.0/gems/railties-5.1.4/lib/rails/engine.rb:549:in `load_seed'  
/es-webui/vender/bundle/ruby/2.3.0/gems/activerecord-5.1.4/lib/active_record/tasks/database_tasks.rb:270:in `load_seed'
/es-webui/vender/bundle/ruby/2.3.0/gems/activerecord-5.1.4/lib/active_record/railties/databases.rake:184:in `block (2 levels) in <top (required)>'  
/es-webui/vender/bundle/ruby/2.3.0/gems/railties-5.1.4/lib/rails/commands/rake/rake_command.rb:21:in `block in perform'
/es-webui/vender/bundle/ruby/2.3.0/gems/railties-5.1.4/lib/rails/commands/rake/rake_command.rb:18:in `perform'  
/es-webui/vender/bundle/ruby/2.3.0/gems/railties-5.1.4/lib/rails/command.rb:46:in `invoke'
/es-webui/vender/bundle/ruby/2.3.0/gems/railties-5.1.4/lib/rails/commands.rb:16:in `<top (required)>'  
bin/rails:4:in `require'
bin/rails:4:in `<main>'  
Tasks: TOP => db:seed  
(See full trace by running task with --trace)  
###該当のソースコード  
ruby  
#db/seed.rb  
list = [  
"aaa001",  
"aaa002",  
"aaa003",  
"aaa004",  
"aaa005"  
]  

list.each do |l|  
json_path = "db/testdata/#{l}.json"  
json = ActiveSupport::JSON.decode(File.read(json_path))  
Node.create(name: l,snj: json)  
end  

#models/node.rb  
class Node  
include Mongoid::Document  
include Mongoid::Timestamps  
field :name, type: String  
field :snj, type: Hash  
end  

#a001.json  
{  
"name": "aaa001",  
・・・  
"automatic": {  
"network": {  
"interfaces": {  
"eth0": {  
"addresses": {  
"06:21:E3:AA:8F:10": {  
"family": "lladdr"  
},  
・・・  

```

試したこと

・Web上で検索すると以下の情報がありました
https://jira.mongodb.org/browse/RUBY-1167
Mongoid内部で利用しているMongo gemが2.3.0の場合、似たようなエラーが発生するとの記載はありますが
、2.3.1で修正されているとのことです。

・mongoidのバージョンアップ(6.2.1→7.0.0beta)
・mongoのバージョンアップ(2.4.3→2.5.0beta)
・bsonのバージョンアップ(4.2.2→4.3.0beta)

上記リンクの回避策となるmongo gemを2.3.0より低いバージョンにする手法は、Railsのバージョンとの兼ね合いで
難しいとの判断です

また、railsコンソールから直に登録しようと試みても同様のエラーが発生しました

補足情報(言語/FW/ツール等のバージョンなど)

ruby 2.3.1
rails 5.1.4
mongoid 6.2.1→7.0.0beta
mongo 2.4.3→2.5.0beta

mongoDB 3.4.9

どなたかわかる方、ご教授ください

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Ruby on Rails

    6753questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

  • MongoDB

    236questions

    MongoDBはオープンソースのドキュメント指向データベースの1つです。高性能で、多くのリトルエンディアンシステムを利用することができます。