Javascript:通过对象属性进行递归,并在键或值与模式匹配时替换属性

时间:2013-11-05 18:20:05

标签: javascript json node.js mongodb mongoskin

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

  1. 我正在使用MongoSkin驱动程序进行node.js
  2. 查询字符串可能包含_id字段,并且可能嵌入在子文档中。
  3. 它可以有一个或多个日期(在这种情况下是一个时间日期,如“2013-11-05T15:29:32.128Z”)。在这里,我无法控制属性名称,因此密钥可能是“createdOn”,“lastUpdated”,“submit”等。
  4. 目前,我正在进行以下操作,但它表现得很奇怪。对于嵌套键(如“parent._id”,我传递给collection.find()的对象看起来像{'parent_.id':'xyz'},对于根键,如“_id”,我传递给的对象find()看起来像{_id:'xyz'}

    1. 使用JSON.parse将查询字符串解析为对象
    2. 将该对象传递给两个递归函数,一个用于id,一个用于日期(示例如下)
    3. 使用结果对象作为collection.find()
    4. 的查询参数

      查询字符串可能类似于以下内容,但我无法控制它们。

      {“_ 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,而只是我从子doc的ObjectId中使用的24位十六进制字符串。

0 个答案:

没有答案