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

Posted

技术标签:

【中文标题】使用具有嵌套或条件的多个 where(或 AND)?【英文标题】:Using multiple where(or AND) which have nested or condition? 【发布时间】:2017-10-22 09:22:22 【问题描述】:

如何在 Sailjs 中使用 Waterline ORM 在 mongodb 中进行一个查询,其中有多个 AND 条件,每个 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 道具中使用所有条件也会破坏逻辑。

有什么解决办法吗?

【问题讨论】:

【参考方案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


);

附: : 我没有直接运行这个查询。我可能有一些语法错误。

请查看此页面以获取更多参考 http://sailsjs.com/documentation/reference/waterline-orm/models/query

编辑:对不起,我误解了这个问题,但是对于 mongoDB,您必须使用 native() 方法。应该是这样的

var queryCriteria = 
   "$and" : ["$or" : [ "score" : null ,"activity" : null] ,"$or" : [ 
 "invitedby" : null ,"invited" : null]  ]
 

那么就可以像这样使用native方法了

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 ,则不会创建该字段,即数据可能根本没有 score 字段,在这种情况下,您必须替换 null will $exists: false 。我之前也使用过这种本机方法,在我的 经验非常有限,速度很慢。我记得在我的一个案例中,transactionPerSecond 仅约为 10。请注意。

.native() 的链接http://sailsjs.com/documentation/reference/waterline-orm/models/native

【讨论】:

我正在尝试在 Mongodb 中运行查询,如果您看到我想使用水线模型(如果可能的话)将示例 mysql 查询映射到 mongodb 的问题。 是的,实际上是这样,默认水线的支持非常有限。无论如何,谢谢。

以上是关于使用具有嵌套或条件的多个 where(或 AND)?的主要内容,如果未能解决你的问题,请参考以下文章

Python 操作Redis

python爬虫入门----- 阿里巴巴供应商爬虫

Python词典设置默认值小技巧

《python学习手册(第4版)》pdf

Django settings.py 的media路径设置

Python中的赋值,浅拷贝和深拷贝的区别