Как применить фильтр в documentdb динамически?

Я отправляю один запрос на мой сервер nodejs, который использует documentdb в качестве базы данных.

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, пол, тогда он должен фильтровать данные со всеми параметрами, опять же, эти параметры не определены, они являются динамическими, поэтому я не знаю названия этих параметров при написании запроса, поэтому я хочу применить фильтр на основе поступающих параметров,

так как я могу написать этот запрос?

1 ответ

Я не думаю, что вы можете сделать это без ручной генерации WHERE пункт или придумывать каждую комбинацию. Это именно тот случай использования, который заставил меня создать пакет sql-from-mongo npm.

Используя ваш пример, эта часть вашей строки запроса:

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

переводится в что-то вроде этого JSON вашим обработчиком HTTP-сервера:

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.

Другие вопросы по тегам