$ in当数组为空时不返回任何内容

时间:2019-12-17 11:09:13

标签: mongodb

这是我的过滤器后端代码:

 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 }
            ]

      })

2 个答案:

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

那么,当用户不选择过滤器时,清除功能将删除清空选项……也许有更好的解决方案?