いくつかの選択肢があります。
1.ドットをダッシュに置き換えます。
これは、構造を十分に明確に保つため、私のお気に入りのアプローチです。
あなたによると、「これは1回限りの挿入である」ため、何も壊さないかどうかを確認するのは比較的簡単です(つまり、ダッシュ付きの同じキーが既にある)。他の状況では、これらのチェックをプログラムで行うには、いくつかのコードを記述する必要がありますが、それでも比較的簡単な作業です。
私はこのアプローチに反対することを強くお勧めします。なぜなら、それは将来の大規模なデバッグの頭痛につながるからです。結果のJSONをMongoDBから遠く離れたコードのどこかに使用する人に、ドットが実際にはドットではないことを推測させることは、文字通り誰かの時間を無駄にする良い方法です。そのようなユニコードのトリックを、誰かをだましてキャラクターを別のキャラクターだと思わせたいハッカーに任せてください。
3. BSONを使用します。
あなたがいることを主張しているので、「大抵はなく、その一部を照会するよりも、文書全体を検索するだろう、」このアプローチは大きな欠点がないあなたのケースでは。ただし、「ほとんど」と言いましたが、これは時々、ドキュメントの一部のみを取得することを意味します。
一般的に、欠点は、ドキュメントを検索したり、ドキュメントの一部のみをロードしたりできないことです。
4. Base64などの標準エンコードを使用します。
問題のあるキー(または問題のあるキーと問題のないキーの比率に応じて、すべてのキー)をBase64または16進数に変換することは実行可能なソリューションであり、かなり明示的であるという利点があります:ほとんどの開発者は一目でBase64または16進数の値を認識します。
欠点は、メモリフットプリントの増加と、キーを使用するときにキーをエンコードおよびデコードする必要があることです。
データクエリが曖昧になり、特定のクエリが期待どおりに実行されない理由を把握しようとすると数時間または数日を無駄にするため、このアプローチには強くお勧めします。ドットは予約文字であり、チェックはあなたを保護するためにあります。MongoDBにチェックをスキップするように指示することにより、MongoDBの構文とキーで使用される予約文字との競合に対処する必要があるときだけ延期します。