web-dev-qa-db-ja.com

MongoDBのキーに `.`を含むJSONドキュメントを挿入する

まず、これはプログラミングの問題ではなく、設計の問題です。

既存のJSONデータをフェッチしてMongoDBに挿入する必要があるアプリケーションを作成しています。一部のJSONドキュメントにはピリオド.をキーに入れます。 MongoDBのドキュメントで、ピリオド.はクエリに使用されるため、MongoDBではキーとして使用できません。

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

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

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

結論を出すことができないので、どちらがより良いデザインになるか教えてください。

14
anirudh

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

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

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

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

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

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

3. BSONを使用します。

「ドキュメントの一部を照会するのではなく、ほとんどの場合ドキュメント全体を取得する」と主張しているので、このアプローチには大きな欠点がありません。ただし、「ほぼ」と言ったので、場合によっては、ドキュメントの一部のみを取得することになります。

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

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

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

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

5. セットcheck_keys to false

データクエリがあいまいになり、特定のクエリがなぜそうなのかを理解しようとするのに何時間も何日も無駄になるので、私はこのアプローチに対して強く助言します t想像どおりのことをしてください。ドットは予約文字であり、チェックはあなたを保護するためにここにあります。 MongoDBにチェックをスキップするように指示することで、MongoDBの構文とキーで使用される予約文字の間の競合に対処する必要がある瞬間のみが延期されます。

3

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

0
J_H