Mongodb 当数组为空时,$不返回任何内容
这是我的过滤器后端代码:Mongodb 当数组为空时,$不返回任何内容,mongodb,Mongodb,这是我的过滤器后端代码: db.collection("users") .find({ $or: [ { job: { $in: myFilters.jobs } }, { role: myFilters.role } ] }) 它工作得非常好,当 myFilters.jobs = ["manager","user"] 问题是当myFilters.jobs是空数组[]时,它应该返回所有文档 目前
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 }
]
})
您可以根据获得的值调整条件,如下所示: 使用: 仅限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;
}})
因此,我试图解释我找到的解决方案: 1st.在节点ws中,我接收过滤器,并使用此功能清理它们: 此函数用于删除emptys对象或数组(当用户未在应用程序中选择任何过滤器时) 这是我收到的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);
});
因此,当用户不选择过滤器时,clean函数将删除emptys选项。。。也许有更好的解决方案?如果
作业
为空,您可能只需完全删除该条件。如何在不使用Javascript代码的情况下实现这一点?有没有办法用find()完成这项工作,因为我很快就会有60种不同的过滤器。。。我是否被迫使用if/else或switch js代码来操作我的过滤器?非常感谢,我最终使用了一个类似的系统,但我想知道是否可以避免使用js代码?因为,我很快就会有更多的过滤器,比如20或50个!我尝试过你的解决方案$where,但它似乎没有过滤功能$filter会更好吗?你必须将这些信息添加到问题中,你的答案与你的要求无关,$和
的效果与$或
不同,我已使用$where
db.collection("users")
.find(find)
.toArray(function(err, docs) {
res.send(docs);
});