@kyanny's blog

My life. Opinions are my own.

MongoDB とドットを含むキーと Embedded Document

途中で調べるのが面倒くさくなったので中途半端だけど、調べた範囲でメモしておく。

  • 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