吃水线 - AND & OR 的混合
Waterline - Mix of AND & OR
using-mix-of-and-and-or-clause-in-sails-and-waterline
这两个问题,处理or中有n个字段,而AND中有唯一字段,只是在放置属性名称时隐式添加,那些被转换为ANDS,像这样:
{attribute1: 'valueToMatch', or: [{attribute2: {contains: 'someWord'}}, {attribute3: {contains: 'someWord'}}]
如果 AND(属性 1)只使用一次,这很好,但是如果您想要满足 2 个或更多条件(AND)并且其中有可选条件(OR),这没有帮助
有办法吗?
假设我有一个用户模型喜欢这个
let User = {
attributes:{
firstName: {type: 'string'},
lastName: {type: 'string'}
}
};
并且我希望能够搜索某个字符串是否至少在这些字段之一中 (OR),假设我传递了一个可以是名字或姓氏的字符串,这可以完成使用 or 语法
let searchString = 'John'
let results = yield User.find({or: [
{firstName: {contains: searchString}]},
{lastName: {contains: searchString}]}
});
到目前为止一切顺利,但如果我的搜索字符串包含更多单词,可以说
let searchString = 'John Doe'
除非有包含完整字符串的 firstName 或 lastName 的记录,否则它将不起作用。
我知道有一些 hacky workarouds,比如有一个 fullName 属性,可以在创建和更新时基于其他属性生成并搜索它,但是因为我正在复制数据,所以我不会这样'无法在名字之前使用姓氏进行搜索,这不是一个完美的解决方案。我也可以拆分 searchString 并将每个词添加到 OR 数组,不知何故会更好,但我的结果不会被充分过滤,更不用说排名了,所以它也不是一个完美的解决方案,最后我可以做一个原始查询。 ...
所以真正的问题是如何在水线中执行一个 AND 可以与 or 一起使用以进一步优化,因为对我来说,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}}
]
},
]
});
或者我在这里有什么选择?
哇,答案很明显(一开始对我来说不是),出于某种原因,我认为你只能将一个 attribute/property 添加到添加到 or 数组的对象中,但后来我意识到没有人曾经说过,所以我只需要添加另一个 属性 并合并。
按照问题的相同示例,它可能是这样的:
// 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
我遇到过类似的情况,我真的需要这样的东西:
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
条件,但是在花了很多时间之后,这是 "whatever works"
的情况
using-mix-of-and-and-or-clause-in-sails-and-waterline
这两个问题,处理or中有n个字段,而AND中有唯一字段,只是在放置属性名称时隐式添加,那些被转换为ANDS,像这样:
{attribute1: 'valueToMatch', or: [{attribute2: {contains: 'someWord'}}, {attribute3: {contains: 'someWord'}}]
如果 AND(属性 1)只使用一次,这很好,但是如果您想要满足 2 个或更多条件(AND)并且其中有可选条件(OR),这没有帮助
有办法吗?
假设我有一个用户模型喜欢这个
let User = {
attributes:{
firstName: {type: 'string'},
lastName: {type: 'string'}
}
};
并且我希望能够搜索某个字符串是否至少在这些字段之一中 (OR),假设我传递了一个可以是名字或姓氏的字符串,这可以完成使用 or 语法
let searchString = 'John'
let results = yield User.find({or: [
{firstName: {contains: searchString}]},
{lastName: {contains: searchString}]}
});
到目前为止一切顺利,但如果我的搜索字符串包含更多单词,可以说
let searchString = 'John Doe'
除非有包含完整字符串的 firstName 或 lastName 的记录,否则它将不起作用。
我知道有一些 hacky workarouds,比如有一个 fullName 属性,可以在创建和更新时基于其他属性生成并搜索它,但是因为我正在复制数据,所以我不会这样'无法在名字之前使用姓氏进行搜索,这不是一个完美的解决方案。我也可以拆分 searchString 并将每个词添加到 OR 数组,不知何故会更好,但我的结果不会被充分过滤,更不用说排名了,所以它也不是一个完美的解决方案,最后我可以做一个原始查询。 ...
所以真正的问题是如何在水线中执行一个 AND 可以与 or 一起使用以进一步优化,因为对我来说,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}}
]
},
]
});
或者我在这里有什么选择?
哇,答案很明显(一开始对我来说不是),出于某种原因,我认为你只能将一个 attribute/property 添加到添加到 or 数组的对象中,但后来我意识到没有人曾经说过,所以我只需要添加另一个 属性 并合并。
按照问题的相同示例,它可能是这样的:
// 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
我遇到过类似的情况,我真的需要这样的东西:
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
条件,但是在花了很多时间之后,这是 "whatever works"