使用具有嵌套或条件的多个where(或AND)?

时间:2017-05-22 16:14:21

标签: jquery node.js mongoose sails.js waterline

如何使用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中的所有条件来破坏逻辑。

周围的解决方案?

1 个答案:

答案 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

的链接