1

次のような構造で満たされたコレクションがあります。

{
  "_id": {
      "$oid": "xxxxxxxxxxxxxxxxxx"
   },
  "sections": {
      "Some Cool Section" : {
        "sources" : ["source1", "source2", "source3"]
      }
      "An Awesome Section" : {
        "sources" : ["source1", "source2", "source3"]
      }
   },
  "username": "boatzart"
}

ユーザーが新しい「セクション」を任意に追加できるようにする必要があるため、pymongo を使用して次のようにセクションを追加できます。

userid = bson.ObjectId('xxxxxxxxxxxxxxxxxx')
sectionname = getUnsafeUserInput()
mongo.db.userprofiles.update({'_id' : userid},
  { '$set' : { 'sections.'+sectionname: { 'sources': []} } }
    )

sectionname は安全でないユーザー入力に由来するため、一部の悪意のあるユーザーは、セクション名にピリオドなどを入れてデータベースをめちゃくちゃにすることができます。英数字以外の文字を簡単に削除できますが、これを行うにはもっと良い方法があるはずだと感じています。

入れ子になったフィールドを既存のドキュメントに挿入し、コンテンツをスクラブする必要がないより良い方法はありますか?

そうでない場合、どのキャラクターを安全でないと見なす必要がありますか? すべて非英数字? 生理だけ?ピリオドとドル記号?

4

1 に答える 1

1

スキーマを作り直すことができれば、これらのユーザー定義のセクション名をキーではなく値として扱う方がきれいに機能するはずです。

{
  "_id": {
      "$oid": "xxxxxxxxxxxxxxxxxx"
  },
  "sections": [{
        "name": "Some Cool Section",
        "sources" : ["source1", "source2", "source3"]
      }, {
        "name": "An Awesome Section",
        "sources" : ["source1", "source2", "source3"]
      }
  ],
  "username": "boatzart"
}

動的なキー名を使用すると、クエリと更新が面倒になるため、あまり良い考えではありません。

于 2013-01-04T03:56:06.033 に答える