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);
      });