这是我的过滤器后端代码:
db.collection("users")
.find({
$or: [
{ job: { $in: myFilters.jobs } },
{ role: myFilters.role }
]
})
当
时,效果很好myFilters.jobs = ["manager","user"]
问题是当myFilters.jobs是一个空数组[“”]时,它应该返回所有文档。
当前,这没有返回任何内容,而我需要它返回所有文档:
myFilters.jobs = [""]
请问我该怎么做?
我没有运气就尝试过这个
db.collection("users")
.find({
$or: [
$cond: {
if: { $ne: [myFilters.jobs, ""] },
then: { job: myFilters.jobs },
else: { job: { $in: myFilters.jobs } }
},
{ role: myFilters.role }
]
})
答案 0 :(得分:0)
您可以根据这样获得的值来调整条件:
使用$where:
db.collection("users")
.find({ $where: function() {
return myFilters.jobs.includes(this.job) || this.role === myFilters.role
}})
仅JS:
const cond = {};
if(myFilters.jobs.length === 0) {
cond.role = myFilters.role;
} else {
cond.$or = [
{ job: { $in: myFilters.jobs } },
{ role: myFilters.role }
];
}
db.collection("users")
.find(cond)
更新,根据OP的答案:
db.collection("users")
.find({ $where: function() {
let filter = true;
if(myFilters.jobs && myFilters.jobs.length) filter = myFilters.jobs.includes(this.members);
if(myFilters.role) filter = filter && this.name === myFilters.role;
return filter;
}})
答案 1 :(得分:0)
所以,我试图解释我找到的解决方案:
1st。。在ws节点中,我正在接收过滤器,并使用以下功能对其进行清洁: 此功能可删除清空的对象或数组(即当用户未在应用程序内部选择任何过滤器时)。
这是我正在接收的JSON过滤器,请注意,例如,角色为空,因为用户尚未选择任何角色过滤器。
{"filters":{"role":"","jobs":["database"]}}
它通过此功能,因此角色被删除:
clean(myFilters);
function clean(obj) {
for (var propName in obj) {
if (
obj[propName] === null ||
obj[propName] === undefined ||
obj[propName] === "" ||
!obj[propName].length
) {
delete obj[propName];
}
}
}
2nd
,
然后,我像这样动态地推动过滤器:
var find = {};
find.$and = [];
if (myFilters.role) {
find.$and.push({ role: myFilters.role });
}
if (myFilters.jobs) {
find.$and.push({ job: { $in: myFilters.jobs } });
}
最后,这是db.collection调用:
db.collection("users")
.find(find)
.toArray(function(err, docs) {
res.send(docs);
});
那么,当用户不选择过滤器时,清除功能将删除清空选项……也许有更好的解决方案?