MongoDBのキーに「。」を含むJSONドキュメントを挿入する


14

第一に、これはプログラミングの問題というよりも設計上の問題です。

既存のJSONデータを取得してMongoDBに挿入する必要があるアプリケーションを作成しています。一部のJSONドキュメントには.キーにピリオドが含まれていることがわかりました。MongoDBのドキュメントで.、クエリに使用されるピリオドはMongoDBのキーとして許可されていないことを読みました。

私はWebアプリケーションに多くの挿入を行いません。それはほとんど一度だけの挿入です。また、すべてのデータを取得する必要があるため、ドキュメントの一部を照会するのではなく、ほとんどの場合ドキュメント全体を取得します。

したがって、私の要件を考慮して、JSONドキュメントを保存する方法には2つの選択肢があります。

  1. キーのピリオドをJSONで検索してエスケープし、MongoDBに挿入します。
  2. JSON全体をBSON形式に変換して保存し、エスケープの必要性を回避し、MongoDBの外部で必要に応じてJSONを手動で解析します

結論を出すことができないため、どちらがより良い設計になるか教えてください。


これを解決する1つの方法は、insertメソッドを使用して、check_keysパラメーターをfalseに設定することです。もう1つの方法は、ドキュメントを調べて、出現したすべてのドットを別の文字または同等のUnicode文字(文字)に置き換えることです。
ノア

回答:


3

いくつかの選択肢があります。

1.ドットをダッシュ​​に置き換えます。

これは、構造を十分に明確に保つため、私のお気に入りのアプローチです。

あなたによると、「これは1回限りの挿入である」ため、何も壊さないかどうかを確認するのは比較的簡単です(つまり、ダッシュ付きの同じキーが既にある)。他の状況では、これらのチェックをプログラムで行うには、いくつかのコードを記述する必要がありますが、それでも比較的簡単な作業です。

2. ドットをU + FF0EなどのUnicodeドット文字に置き換えます。

私はこのアプローチに反対することを強くお勧めします。なぜなら、それは将来の大規模なデバッグの頭痛につながるからです。結果のJSONをMongoDBから遠く離れたコードのどこかに使用する人に、ドットが実際にはドットではないことを推測させることは、文字通り誰かの時間を無駄にする良い方法です。そのようなユニコードのトリックを、誰かをだましてキャラクターを別のキャラクターだと思わせたいハッカーに任せてください。

3. BSONを使用します。

あなたがいることを主張しているので、「大抵はなく、その一部を照会するよりも、文書全体を検索するだろう、」このアプローチは大きな欠点がないあなたのケースでは。ただし、「ほとんど」と言いましたが、これは時々、ドキュメントの一部のみを取得することを意味します。

一般的に、欠点は、ドキュメントを検索したり、ドキュメントの一部のみをロードしたりできないことです。

4. Base64などの標準エンコードを使用します。

問題のあるキー(または問題のあるキーと問題のないキーの比率に応じて、すべてのキー)をBase64または16進数に変換することは実行可能なソリューションであり、かなり明示的であるという利点があります:ほとんどの開発者は一目でBase64または16進数の値を認識します。

欠点は、メモリフットプリントの増加と、キーを使用するときにキーをエンコードおよびデコードする必要があることです。

5.に設定check_keysfalseます。

データクエリが曖昧になり、特定のクエリが期待どおりに実行されない理由を把握しようとすると数時間または数日を無駄にするため、このアプローチには強くお勧めします。ドットは予約文字であり、チェックはあなたを保護するためにあります。MongoDBにチェックをスキップするように指示することにより、MongoDBの構文とキーで使用される予約文字との競合に対処する必要があるときだけ延期します。


0

BSONを使用してください。次に、十分にテストされたライブラリサポートを備えた、十分に文書化された形式があり、最も重要なことは、損失なしにそれを反転(エンコード/デコード)できることです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.