途中で調べるのが面倒くさくなったので中途半端だけど、調べた範囲でメモしておく。
- MongoDB ではドキュメントのキーにドットを含むことはできない
- Embedded Document 内のキーにアクセスするとき、階層の区切りとしてドットを使うので、ドキュメントのキー自体にドットを含めてしまうと、そういうキーなのか embedded document へのアクセスなのか判別できないため
- mongo-ruby-driver v2.4.3 だと insert 時にエラーになる
- しかし mongo-ruby-driver v1.12.5 だと insert 時はエラーにならない
- しかし insert できたドキュメントを update するときはエラーになる
- クライアント側ではなくサーバ側にコマンドを送った結果がエラーなのでサーバ側でエラーになっていそう
- ではなぜ insert は通って update は通らないのか?が謎
- おそらく v1.12.5 の振る舞いのほうがおかしい
- v.1.12.5 だとうっかりドットをキーに含むドキュメントを作れてしまうが、本来おかしいデータなので作らないほうがよい
GitHub - kyanny/mongo-dotted-key: My study about MongoDB and dotted key name
ちなみに mongo shell から試した場合も、キーにドットを含むのは NG となる
-[3880]% mongo MongoDB shell version v3.4.5 connecting to: mongodb://127.0.0.1:27017 MongoDB server version: 3.2.11 WARNING: shell and server versions do not match > db.books.insert({"meta":{"ok.google":"hey.siri"}}) 2017-09-12T02:33:37.425+0900 E QUERY [thread1] Error: can't have . in field names [ok.google] : DBCollection.prototype._validateForStorage@src/mongo/shell/collection.js:244:1 DBCollection.prototype._validateForStorage@src/mongo/shell/collection.js:252:13 Bulk/this.insert@src/mongo/shell/bulk_api.js:663:17 DBCollection.prototype.insert@src/mongo/shell/collection.js:349:13 @(shell):1:1