0

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

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

此请求 url 是固定的,Ex./student/:classId但剩余部分是动态的,可能会出现,也可能不会出现。

现在,如果我得到查询字符串参数,那么我想在我的 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 肯定会出现,但剩余的参数不是固定的,所以我想编写可以像这样过滤的那种类型的查询:假设我只传递年龄,那么它应该只按年龄过滤集合,假设我传递所有其他参数之类的。studentId, name, age, gender 那么它应该使用所有参数过滤数据,这个参数没有定义它们是动态的,所以我在编写查询时不知道这些参数的名称,所以我想根据即将到来的参数应用过滤器,

那么我该如何编写这个查询呢?

4

1 回答 1

0

如果不手动生成WHERE子句或想出每个组合,我认为您无法做到这一点。这正是导致我创建sql-from-mongo npm 包的用例。

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

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 生成的字符串是安全的。

于 2017-03-20T16:05:17.930 回答