我的问题与Waterline (Sails.js): AND conditions相同。有一个答案,但它对我不起作用(对于提问者而言)。
据我所知,水线在查询语言中没有关键字'和'。 如果我有多个条件要查询,我可以简单地使用:
MyModel.find({fieldA:valueA, filedB:valueB});
但我的问题是怎么做:
MyModel.find({fieldA:{
contains:keyword1,
contains:keyword2
}});
因为我无法在Object / JSON中设置两个具有相同名称的键,所以我尝试了:
MyModel.find({fieldA:
[
{contains:keyword1},
{contains:keyword2}
]
});
和
MyModel.find({fieldA:
{contains:[keyword1,keyword2]}
});
和
MyModel.find()
.where({fieldA:{contains:keyword1})
.where({fieldA:{contains:keyword2}});
但它们都没有按预期工作:第一个和第二个返回空集,第三个只返回keyword2。 看来当你试图将两个'contains'条件添加到同一个字段(fieldA)时,使用链接'where'方法,第二个将覆盖第一个。
我正在使用本机mongoDB的方式来解决这个问题,Dose任何人都知道如何以水线方式执行此操作?或者这是一个问题应该在github上报告。
PS:抱歉我的英语不好:p
答案 0 :(得分:4)
要回答您的问题,不支持多个contains
。无论是遗漏还是功能请求都值得商榷。至少对于一个SQL案例,它是一个愚蠢的简单修复(虽然花了我一个多小时才能找到它)能够支持类似的东西:
orm.collections.user.find({
and: [
{ name: { contains: 'neil' } },
{ name: { contains: 'armstrong' } }
]
});
以下文件中所需要的只是case 'and':
并且有效:
https://github.com/balderdashy/waterline-sequel/blob/master/sequel/lib/criteriaProcessor.js#L120
我怀疑Mongo案件是相似的。
答案 1 :(得分:4)
我找到了mongo数据库应该采用的方式。
您应该能够使用$and
键在同一个字段上组合多个标准:
orm.collections.user.find({
$and: [
{ name: { contains: 'neil' } },
{ name: { contains: 'armstrong' } }
]
});
Sails-mongo源代码显示了这一点:
/**
* Parse Clause
*
* <clause> ::= { <clause-pair>, ... }
*
* <clause-pair> ::= <field> : <expression>
* | or|$or: [<clause>, ...]
* | $or : [<clause>, ...]
* | $and : [<clause>, ...]
* | $nor : [<clause>, ...]
* | like : { <field>: <expression>, ... }
*
* @api private
*
* @param original
* @returns {*}
*/