有任何动态链接查询的方法吗?
例如,给定以下GET请求
/collection?field1=value1&field2=value2&sort=field3 asc
没有排序查询很容易
/collection?field1=value1&field2=value2
var query = {}
for (var key in query) {
query[key] = req.query[key]
}
Collection.find(query)
但是,如果存在可选查询键,如排序、展开和选择分别指向Collection.sort、Collection.popul和Collection.select的映射,我该如何构建GET请求?
换句话说,假设您有一个动态查询方法数组:
queries = [populate, select, sort]
解决方案如下:
var query = Collection.find()
for (var q in queries)
query = query.q
您只需遍历查询参数,并将操作与实际查询条件分开。使用您的示例:
// sample data for req.query
const req = {
query: {
sort: "field9",
field1: "someValue",
field2: "otherValue",
field3: "highValue"
}
};
const queries = new Map();
const operations = new Map([
["populate", false],
["sort", false],
["select", false]
]);
for (const [key, value] of Object.entries(req.query)) {
if (operations.has(key)) {
operations.set(key, value);
} else {
queries.set(key, value);
}
}
// here:
// queries contain the non-operation pairs
// operations (if not false) contain the operation value such
// as sort => "field9"
console.log("operations:");
for (let [key, value] of operations.entries()) {
console.log(`${key} => ${value}`);
}
console.log("queries:");
for (let [key, value] of queries.entries()) {
console.log(`${key} => ${value}`);
}
要运行该操作,您必须检查存在哪些操作,并根据存在的操作分支代码和查询。