动态链接查询



有任何动态链接查询的方法吗?

例如,给定以下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}`);
}

要运行该操作,您必须检查存在哪些操作,并根据存在的操作分支代码和查询。

最新更新