如何动态地在documentdb中应用过滤器?

时间:2017-03-20 12:31:12

标签: javascript node.js database azure-cosmosdb azure-hub

我向我的nodejs服务器发送一个请求,该服务器使用documentdb作为数据库。

Ex./student/:classId?studentId=1234&name=piyush&age=14&gender=male&class=12

此请求网址已固定到Ex./student/:classId,但重新生成的部分是动态的,可能会来,可能不会。

现在,如果我收到querystring params,那么我想在documentdb查询中应用过滤器。

var query = {
        query: 'SELECT * FROM root r WHERE r.classId=@classIdAND r.collectionName="students"',
        parameters: [{
            name: '@classId',
            value: classId
        }]
    };

    docDbClient.queryDocuments(collection._self, query).toArray(function (err, results) {
        if (err) {
            return callback(err);
        }
        callback(null, results[0]);
    });

所以这里classId肯定会出现,但剩下的参数不是固定的,所以我想编写那种类型的查询,可以像这样过滤:假设我正在通过年龄,那么它应该只是按年龄过滤收集,假设我是通过所有其他params喜欢。 studentId,名字,年龄,性别然后它应该过滤所有参数的数据,再次这个参数没有定义它们是动态的所以我在编写查询时不知道这些参数的名称所以我想应用基于的过滤器即将到来的参数,

那我怎么写这个查询呢?

1 个答案:

答案 0 :(得分:0)

我不认为你可以在没有手工生成WHERE条款或提出每个组合的情况下做到这一点。这正是导致我创建sql-from-mongo npm package

的用例

使用您的示例,查询字符串的这一部分:

studentId=1234&name=piyush&age=14&gender=male&class=12

被HTTP服务器处理程序转换为类似JSON的东西:

myQuerySpec = {
  studentId: 1234,
  name: "piyush",
  age: 14,
  gender: "male",
  class: 12
};

数字可能以字符串或数字形式出现,因此您可能需要调整数字的类型,具体取决于HTTP服务器处理程序如何转换这些数字以及是否将它们存储为整数(可能是年龄和类)或字符串(可能是studentId)。但是,一旦你有了你想要的JSON,你就可以将它传递给sql-from-mongo,如下所示:

query = "SELECT c.fieldA, c.fieldB FROM c WHERE " + sqlFromMongo(myQuerySpec, 'c');

或者如果您希望它自动创建样板:

query = sqlFromMongo(myQuerySpec, "c", ["fieldA", "fieldB"])

或者如果您希望它自动获取所有字段:

query = sqlFromMongo(myQuerySpec, "c", "*")

请注意,由于正确转义字符串,sql-from-mongo创建的查询不受注入攻击的影响。因此,虽然我们都被教导使用参数化SQL查询以避免SQL注入的风险,但使用sql-from-mongo生成的字符串是安全的。