如何将HTML表单变量传入MongoDB Aggregate聚合函数?
问题原因与解决方法
问题根源
你当前的代码里,$project阶段的q1:1是把q1当成了字面量字段名,而不是你传入的变量q1的实际值(也就是表单提交的数据库列名)。数据库里不存在名为q1的字段,所以返回的结果都是空对象。
解决方案
要让MongoDB识别变量对应的字段名,需要用动态属性名的方式来构建$project的配置对象,有两种常用方式:
方式1:ES6计算属性名(推荐)
直接在对象字面量里用方括号包裹变量,将变量值作为字段名:
async function query(dataSetName,q1,q2,q3){ var filterd = await mongoose.connection.db.collection(dataSetName).aggregate([ {$project:{ _id: 0, [q1]: 1, // 用方括号包裹变量,使用变量值作为字段名 [q2]: 1 }} ]).toArray() console.log(filterd); }
方式2:手动构建投影对象
如果环境不支持ES6语法,可以先创建空对象,再通过变量赋值添加属性:
async function query(dataSetName,q1,q2,q3){ // 先构建投影配置对象 const projectConfig = { _id: 0 }; projectConfig[q1] = 1; projectConfig[q2] = 1; var filterd = await mongoose.connection.db.collection(dataSetName).aggregate([ {$project: projectConfig} ]).toArray() console.log(filterd); }
效果验证
修改后,$project会使用你从表单传入的q1、q2的实际值作为投影字段,比如表单传的是"age"和"name",就会投影age:1和name:1,就能正确返回对应字段的数据了。
内容的提问来源于stack exchange,提问作者OFMN21
相关产品推荐
相关产品推荐

