javascript - 如果它来自前端,如何添加 MongoDB 匹配参数,如果不是,则不添加任何参数?
问题描述
我正在使用 NodeJS 在 MongoDB 中创建一个聚合。当使用参数调用解析器函数时,我希望将其添加到 MongoDB 匹配函数中,如果它不存在,则不会添加。我面临的问题是,如果没有添加,则没有结果,如果有添加,则查询无法正常进行。它是这样来的:phaseMatch = 'phase': { $in: CAT,MOD }
。我怎样才能让它像phaseMatch = 'phase': { $in: ['CAT','MOD'] }
?有没有办法只在 MongoDB 聚合中执行此条件而不使用任何 JS?
async WeeklyTable(_, { batchSize, phase }) {
let res = [];
let phaseMatch = "";
if(phase) phaseMatch = "'phase': { $in: " + phase + " }";
return await collection.aggregate([{
$match: {
"segment": {
$exists: true,
$ne: null
},
phaseMatch
}
}];
}
解决方案
动态构建查询条件的方法有很多,这里有一个简单的例子:
async WeeklyTable(_, { batchSize, phase }) {
const res = [];
const matchCond = {
"segment": {
$exists: true,
$ne: null
},
}
if(phase) {
matchCond.phase = {$in: phase}
};
return await collection.aggregate([{
$match: matchCond
}];
}
不确定您要如何将其创建为字符串,Mongo 驱动程序不会将字符串参数解析为查询条件。
编辑没有任何 javascript 你可以这样做:
db.collection.aggregate([
{
$match: {
"segment": {
$exists: true,
$ne: null
},
$expr: {
"$setIsSubset": [
[
"$phase"
],
{
$ifNull: [
phase,
[
"$phase"
]
]
}
]
}
}
}
])
推荐阅读
- javascript - 如何检索函数输出的最大值
- python - setup.py 将所有文件作为单独的包导入
- swiftui - SwiftUI 替代关闭中的完成关闭(动画:完成 :)
- java - 创建 bean 时出错;通过字段表示的不满足的依赖关系
- python - 什么是“类型错误:无法腌制弱引用对象”
- flutter - 为什么 pushAndRemoveUntil 不删除相同的路由?
- r - 如何在R中计算模糊性能指标和归一化分类熵
- javascript - 使用 innerHTML 和引号复制脚本
- jquery - 为什么 jquery 在 laravel 8 中无法使用路由参数?
- flutter - 如何为 XFile 类创建 Hive 适配器