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

Javascript 如何在documentdb中动态应用过滤器?,javascript,node.js,database,azure-cosmosdb,azure-hub,Javascript,Node.js,Database,Azure Cosmosdb,Azure Hub,我正在向使用documentdb作为数据库的nodejs服务器发送一个请求 Ex./student/:classId?studentId=1234&name=piyush&age=14&gender=male&class=12 此请求url在Ex./student/:classId之前是固定的,但发回部分是动态的,可能会出现,也可能不会出现 现在,如果我得到querystring参数,那么我想在documentdb查询中应用过滤器 var query = {

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

Ex./student/:classId?studentId=1234&name=piyush&age=14&gender=male&class=12
此请求url在
Ex./student/:classId
之前是固定的,但发回部分是动态的,可能会出现,也可能不会出现

现在,如果我得到querystring参数,那么我想在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、姓名、年龄、性别然后它应该使用所有参数筛选数据,同样,这些参数没有定义它们是动态的,所以我在编写查询时不知道这些参数的名称,所以我想根据即将出现的参数应用筛选


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

我认为,如果不手动生成
WHERE
子句或想出每一个组合,就无法完成查询。这正是促使我创建的用例

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

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,就可以从mongo将其传递给sql,如下所示:

query = "SELECT c.fieldA, c.fieldB FROM c WHERE " + sqlFromMongo(myQuerySpec, 'c');
或者,如果希望它自动创建样板文件:

query = sqlFromMongo(myQuerySpec, "c", ["fieldA", "fieldB"])
或者,如果希望自动获取所有字段:

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

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

这对我来说是在documentdb查询中抛出错误,但在mongodb中工作,那么我如何在documentdb中运行呢?这是针对documentdb:myQuerySpec={studentId:1234,名称:“piyush”,年龄:14岁,性别:男,班级:12};queryspec:{query:'SELECT*FROM root r其中'+sqlFromMongo(myQuerySpec,'r')+'和r.collectionName=“students”}您需要在
queryspec
后面加一个等号,而不是冒号。对不起,我错在这里加了冒号,不是在我的代码中,它在我的代码中是相等的,尽管它的抛出错误。查询中靠近“sqlFromMongo(myQuerySpec)”的语法错误在错误响应中。