水线 - AND& amp;要么

时间:2016-03-08 17:58:53

标签: sails.js waterline

using-mix-of-and-and-or-clause-in-sails-and-waterline

use-and-in-waterline

这两个问题都涉及在or中有n个字段,但是AND中的唯一字段,只是在放置属性名称时隐式添加,这些字段被转换为ANDS,如下所示:

{attribute1: 'valueToMatch', or: [{attribute2: {contains: 'someWord'}}, {attribute3: {contains: 'someWord'}}]

如果AND(attribute1)仅使用一次,但是如果你想要满足2个或更多条件(AND)并且那些在(OR)内部具有可选条件,那么这是没有问题的,这不是帮助

有办法吗?

假设我有一个像这样的用户模型

let User = {
  attributes:{
    firstName: {type: 'string'},
    lastName:  {type: 'string'}
  }
};

并且我希望能够搜索某个字符串是否至少在其中一个字段(OR)中,假设我传递的字符串可以是名字或姓氏,可以使用或语法

let searchString = 'John'
let results = yield User.find({or: [
   {firstName: {contains: searchString}]},
   {lastName: {contains: searchString}]}
});

到目前为止一切顺利,但如果我的搜索字符串包含更多单词,请说

let searchString = 'John Doe'

除非存在包含完整字符串的firstName或lastName的记录,否则它将无法工作。

我知道有一些hacky workarouds,比如有一个可以在create& amp;更新基于其他的并搜索,但由于我复制数据,这样我就不能在firstName之前用lastName搜索,这不是一个完美的解决方案。此外,我可以拆分searchString并将每个字添加到OR数组,并且不知何故更好,但我的结果不会被过滤,更不用说排名了,所以它也不是一个完美的解决方案,最后我可以做一个原始的查询......

所以真正的问题是如何在水线中做一个可以与a一起使用或进一步细化的AND,因为对我来说,AND是根据传递的属性名称标准生成的。

有类似的东西吗?

// Lets assume i've splitted the searchString
let string1 = 'John';
let string2 = 'Doe'
let results = yield User.find({
  and: [
   {or: [
       {firstName: {contains: string1}},
       {lastName: {contains: string1}}
     ]
   },
   {or: [
      {firstName: {contains: string2}},
      {lastName: {contains: string2}}
    ]
   },
  ]
});

或者我有什么选择?

2 个答案:

答案 0 :(得分:3)

我有类似的情况,我真的需要有类似的东西:

var whereCondition = {
    //...
    and: [
        { or: [...]},
        { or: [...]}
    ]
    //...
}

解决方案是在自己内嵌或条件:

var where = {
    or: [
        { 
            name: 'Jim',
            or: [
                { 
                    age: 30
                },
                { 
                    age: 31
                },
            ]
        },
        { 
            name: 'Joe',
            or: [
                { 
                    age: 30
                },
                { 
                    age: 31
                },
            ]
        },
    ]
}

经过一些清理后:

var where = {
    or: [
        { 
            name: 'Jim'
        },
        { 
            name: 'Joe'
        },
    ]
}

for (var i = 0; i < where.or.length; i++) {
    where.or[i].or = [
                { 
                    age: 30
                },
                { 
                    age: 31
                },
            ];
}

看起来有点难看,我本来希望使用and条件,但是花了很多时间在这上面,这是&#34;无论什么工作&#34;

答案 1 :(得分:0)

哇,答案非常明显(一开始并不是我),出于某些原因我认为你只能添加一个属性/属性到添加到数组中的对象,但后来我意识到没有人说过,所以我只需要添加另一个属性并组合。

在问题上使用相同的例子,它可能是这样的:

// Lets assume i've splitted the searchString
let string1 = 'John';
let string2 = 'Doe'
let results = yield User.find({or: [
       {firstName: {contains: string1}, lastName: {contains: string2}},
       {lastName: {contains: string1}, {firstName: {contains: string2}}
     ]
});

就是这样,不需要明确的AND