如何使用Sailjs中的Waterline ORM在mongodb中进行查询,并且多个AND条件中的每一个都具有嵌套的OR条件。
示例MySQL查询将是:
SELECT * FROM Users WHERE (score IS NULL OR activity IS NULL) AND (invited IS NULL OR invited_by IS NULL)
使用多个.where()似乎没有工作,也使用OR prop中的所有条件来破坏逻辑。
周围的解决方案?
答案 0 :(得分:1)
我不确定它是否在您预期的解决方案的范围内,但为什么不.query()方法。
Users.query('SELECT * FROM Users WHERE (score IS NULL OR activity IS NULL) AND (invited IS NULL OR invited_by IS NULL)', [ ] ,function(err, result) {
if (err) { // do something }
else {// do something else with the result}
});
P.S。 :我没有直接运行此查询。我这可能有一些语法错误。
请查看此页面以获取更多参考 http://sailsjs.com/documentation/reference/waterline-orm/models/query
编辑:对不起,我误解了这个问题,但是使用mongoDB你必须使用native()方法。它应该是像这样的东西var queryCriteria = {
"$and" : [{"$or" : [{ "score" : null },{"activity" : null}] },{"$or" : [{
"invitedby" : null },{"invited" : null}] } ]
}
然后你可以使用像这样的本地方法
Users.native(function(error, collection) {
if (error) return res.serverError(error);
collection.find(queryCriteria ,{}).toArray(function (err, results) {
if (err) return res.serverError(err);
return res.ok(results);
});
});
P.P.S:MongoDB没有架构。因此,如果您在创建数据时未明确输入null,则不会创建该字段,即数据可能根本没有分数字段。在这种情况下,您必须将null替换为{$ exists:false}。我之前也使用过这种原生方法 非常有限的经验它很慢..我记得在我的一个案例中只获得了10左右的transactionPerSecond。请看看它。
.native()http://sailsjs.com/documentation/reference/waterline-orm/models/native
的链接