MongoDB クエリのように見えるユーザー提供の JSON 文字列を受け入れています。それに対して検証と処理を行い、クエリとして MongoDB に発行したいと考えています。
- node.jsにMongoSkinドライバーを使用しています
- クエリ文字列には _id フィールドが含まれている場合があり、サブドキュメントに埋め込まれている場合があります。
- 1 つまたは複数の日付を含めることができます (この場合は、"2013-11-05T15:29:32.128Z" のようなタイムデートです)。ここでは、プロパティ名を制御できないため、キーは「createdOn」、「lastUpdated」、「submitted」などになる可能性があります。
現在、私は以下をやっていますが、奇妙な動作をしています。ネストされたキー ("parent._id" など) の場合、collection.find() に渡すオブジェクトは {'parent_.id':'xyz'} のように見えます。ルート キーの場合は、"_id" のように渡します。 find() は {_id:'xyz'} のように見えます
- JSON.parse を使用して、クエリ文字列をオブジェクトに解析します
- そのオブジェクトを 2 つの再帰関数に渡します。1 つは ID 用、もう 1 つは日付用です (以下の例)。
- 結果のオブジェクトを 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 進数文字列であることを発見しました。