我正在接受用户提供的类似于 MongoDB 查询的 JSON 字符串,我想对其进行一些验证和处理,并将其作为查询发送给 MongoDB。
- 我正在为 node.js 使用 MongoSkin 驱动程序
- 查询字符串可能有一个 _id 字段,并且它可能嵌入在子文档中。
- 它可以有一个或多个日期(在这种情况下是一个时间日期,例如“2013-11-05T15:29:32.128Z”)。在这里,我无法控制属性名称,因此键可能是“createdOn”、“lastUpdated”、“submitted”等。
目前,我正在执行以下操作,但它的行为很奇怪。对于嵌套键(如“parent._id”,我传递给 collection.find() 的对象看起来像 {'parent_.id':'xyz'},对于根键,如“_id”,我传递给的对象find() 看起来像 {_id:'xyz'}
- 使用 JSON.parse 将查询字符串解析为对象
- 将该对象传递给两个递归函数,一个用于 ids,一个用于日期(示例如下)
- 使用结果对象作为 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 位十六进制字符串。