如何实现MongoDB的Dynamically Chaining Queries动态链式查询
动态链式查询实现方案
你给出的示例写法不可行,核心问题有3点:
for...in遍历数组拿到的是下标索引,不是你定义的方法名query.q是取query上名为q的固定属性,不是取变量q对应的动态属性,应该用query[q]写法- 没有传递对应方法需要的参数,只是把方法本身赋值给了query,完全没有执行链式调用
正确实现思路
- 先划分普通过滤字段和特殊操作字段,提前声明需要特殊处理的查询操作对应的Mongoose方法名
- 提取所有非特殊操作的字段构建基础查询条件,初始化查询实例
- 遍历特殊操作列表,判断请求参数中是否存在对应值,存在就调用查询实例上的对应方法传入参数,复用同一个查询实例实现链式调用
参考代码
// 提前定义URL查询参数和Mongoose查询方法的映射 const queryMethodMap = { sort: 'sort', expand: 'populate', select: 'select' } const specialQueryKeys = Object.keys(queryMethodMap) // 1. 构建普通字段的查询过滤条件 const filter = {} for (const key in req.query) { if (!specialQueryKeys.includes(key)) { filter[key] = req.query[key] } } // 2. 初始化基础查询实例 let query = Collection.find(filter) // 3. 动态拼接链式调用 for (const key of specialQueryKeys) { if (req.query[key]) { const method = queryMethodMap[key] // 可按需在此处添加参数格式化逻辑,比如多字段排序的格式转换 query = query[method](req.query[key]) } } // 4. 执行最终查询 const result = await query.exec()
内容的提问来源于stack exchange,提问作者Facade
相关产品推荐
相关产品推荐

