lookback API,其中过滤器具有多个条件

时间:2018-03-01 22:10:22

标签: loopbackjs

使用loopback API时,' AND'操作员多余的'其中'过滤多种条件? 例如,我测试了以下两个查询,它们返回相同的结果:

<model>.find({ where: { <condition1>, <condition2> } });
<model>.find({ where: { and: [<condition1>, <condtion2>] } });

更具体地说,假设这是表格内容:

name   value
----   -----
a      1
b      2

当我执行&#39; find()&#39;使用两个不同的&#39;其中&#39;过滤器,我在两种情况下都获得了第一条记录:

{ where: { name: 'a', value: 1 } }
{ where: { and: [ { name: 'a'}, { value: 1 } ] } }

我已经阅读了API文档,但在有多个条件时没有找到使用的逻辑运算符。 如果&#39; AND&#39;如我的测试所示是多余的,我不喜欢使用它。但我只是想确定一般情况下这是否正确,或者它恰好适用于我正在使用的postgreSQL。

2 个答案:

答案 0 :(得分:0)

这是一个有效的查询,只能使用和语句完成。

  {
    "where": {
      "or": [
        {"and": [{"classification": "adn"}, {"series": "2"}]},
        {"series": "3"}
      ]
    }
  }

编辑:https://github.com/strongloop/loopback-filters/blob/master/index.js

function matchesFilter(obj, filter) {
  var where = filter.where;
  var pass = true;
  var keys = Object.keys(where);
  keys.forEach(function(key) {
    if (key === 'and' || key === 'or') {
      if (Array.isArray(where[key])) {
        if (key === 'and') {
          pass = where[key].every(function(cond) {
            return applyFilter({where: cond})(obj);
          });
          return pass;
        }
        if (key === 'or') {
          pass = where[key].some(function(cond) {
            return applyFilter({where: cond})(obj);
          });
          return pass;
        }
      }
    }
    if (!test(where[key], getValue(obj, key))) {
      pass = false;
    }
  });
  return pass;
}

它遍历查找失败的where对象的键,因此它就像你的情况中的隐式and语句一样。

编辑2:https://github.com/strongloop/loopback-datasource-juggler/blob/cc60ef8202092ae4ed564fc7bd5aac0dd4119e57/test/relations.test.js

loopback数据源juggler包含使用隐式and格式

的测试
{PictureLink.findOne({where: {pictureId: anotherPicture.id, imageableType: 'Article'}},

{pictureId: anotherPicture.id, imageableId: article.id, imageableType: 'Article',}

答案 1 :(得分:0)

  

但我只是想确定一般情况下这是否属实,或者它是否恰好适用于我正在使用的postgreSQL。

总的来说是真的吗?否。

似乎这是在SQLConnector中为PostgreSQL和MySQL(可能还有其他SQL数据库)处理的。因此,不使用SQLConnector(例如MongoDB)的连接器可能不支持此功能。但是,鉴于我在网上看过很多例子,我认为假设其他连接器也以这种方式实现它也是安全的。