0

我正在接受用户提供的类似于 MongoDB 查询的 JSON 字符串,我想对其进行一些验证和处理,并将其作为查询发送给 MongoDB。

  1. 我正在为 node.js 使用 MongoSkin 驱动程序
  2. 查询字符串可能有一个 _id 字段,并且它可能嵌入在子文档中。
  3. 它可以有一个或多个日期(在这种情况下是一个时间日期,例如“2013-11-05T15:29:32.128Z”)。在这里,我无法控制属性名称,因此键可能是“createdOn”、“lastUpdated”、“submitted”等。

目前,我正在执行以下操作,但它的行为很奇怪。对于嵌套键(如“parent._id”,我传递给 collection.find() 的对象看起来像 {'parent_.id':'xyz'},对于根键,如“_id”,我传递给的对象find() 看起来像 {_id:'xyz'}

  1. 使用 JSON.parse 将查询字符串解析为对象
  2. 将该对象传递给两个递归函数,一个用于 ids,一个用于日期(示例如下)
  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 位十六进制字符串。

4

0 回答 0