Как применить фильтр в 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.