0

MongoDB クエリのように見えるユーザー提供の JSON 文字列を受け入れています。それに対して検証と処理を行い、クエリとして MongoDB に発行したいと考えています。

  1. node.jsにMongoSkinドライバーを使用しています
  2. クエリ文字列には _id フィールドが含まれている場合があり、サブドキュメントに埋め込まれている場合があります。
  3. 1 つまたは複数の日付を含めることができます (この場合は、"2013-11-05T15:29:32.128Z" のようなタイムデートです)。ここでは、プロパティ名を制御できないため、キーは「createdOn」、「lastUpdated」、「submitted」などになる可能性があります。

現在、私は以下をやっていますが、奇妙な動作をしています。ネストされたキー ("parent._id" など) の場合、collection.find() に渡すオブジェクトは {'parent_.id':'xyz'} のように見えます。ルート キーの場合は、"_id" のように渡します。 find() は {_id:'xyz'} のように見えます

  1. JSON.parse を使用して、クエリ文字列をオブジェクトに解析します
  2. そのオブジェクトを 2 つの再帰関数に渡します。1 つは ID 用、もう 1 つは日付用です (以下の例)。
  3. 結果のオブジェクトを collection.find() のクエリ パラメータとして使用します。

クエリ文字列は次のようになりますが、私には制御できません。

{"_id":"12o3iu4y2134iouy", "送信済み":"2013-11-05T15:29:32.128Z"}

{"child._id":"12o3iu4y2134iouy", "comment.submitted":"2013-11-05T15:29:32.128Z"}

アプローチに関する提案、または私の関数/アルゴリズムに何か問題がありますか?

function recurseForMongoKeys(qString){
    for (key in qString) {
        if (typeof qString[key] === 'object'){
            recurseForMongoKeys(qString[key]);
        }
        else {
            if (key.split(".").pop() === '_id') {  // process leaf node
            key = req.coll.id(qString[key]);
        }
    }
}

更新: ネストされた ID (上記の例の「child._id」) が実際には ObjectId ではなく、子ドキュメントの ObjectId から使用した 24 桁の 16 進数文字列であることを発見しました。

4

0 に答える 0