途中で調べるのが面倒くさくなったので中途半端だけど、調べた範囲でメモしておく。
- 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