php - MongoDB/Doctrine : can't nest $or in $and

我在 $and 操作中嵌套多个二操作数 $or 操作时遇到问题。 this discussion的结论听起来与我需要的相似,但我无法让它工作。这是我正在尝试做的 JavaScript:

db.Business.find(
  {
    $and:
      [
        { $or: [{nm: /American/}, {dsc: /American/}] },
        { $or: [{nm: /Mega/}, {dsc: /Mega/}] }
      ]
  }
)

这在 MongoDB 交互式 shell 中有效。

这里有一些 PHP 对我来说看起来不错但不起作用(在指示的地方导致无限递归):

$q = $doctrineOdm->createQueryBuilder('Business');
foreach (array('American','Mega') as $keyword) {
  $r = new \MongoRegex('/'.$keyword.'/i');
  $q->addAnd(
    $q->addOr($q->expr()->field('nm')->equals($r))
      ->addOr($q->expr()->field('dsc')->equals($r))
  );
}
print_r($q->getQuery()->getQuery()); // infinite recursion
$cursor = $q->getQuery()->execute();

有什么想法吗?

Crossposted here .

最佳答案

听起来您需要在将其添加到 $q 之前构建一个单独的子查询。

$q->addAnd(...) 被立即评估并将其自身添加到 $q,但您希望它等待。

我没有安装这个包,所以我无法测试,但这只是一个预感。希望对您有所帮助。

$q = $doctrineOdm->createQueryBuilder('Business');
foreach (array('American','Mega') as $keyword) {
  $r = new \MongoRegex('/'.$keyword.'/i');
  $q->addAnd(
    $q->expr()->addOr($q->expr()->field('nm')->equals($r))
              ->addOr($q->expr()->field('dsc')->equals($r))
  );
}
print_r($q->getQuery()->getQuery()); // infinite recursion
$cursor = $q->getQuery()->execute();

关于php - MongoDB/Doctrine : can't nest $or in $and,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10115321/

相关文章:

ruby-on-rails - 获取字段最大值的对象[Mongoid]

mongodb - 我可以/应该在 Mongoose 中索引嵌入的文档吗?

mongodb - mongoose 更新 MongoDB 中的字段不起作用

mongodb - 处理 100+ 百万条记录的最佳 NoSQL 方法

mongodb - 设置 MongoDB 数据库配额 (SIZE)

node.js - 我应该将图像存储在 MongoDB 中还是本地文件系统中(通过 Node.js)

mongodb - 当数据库大小大于 RAM 时,MongoDB 可以工作吗?

java - 如何使用 $ne 运算符查询 mongodb?

ruby-on-rails-3 - 使用 MongoID 在 Rails 中进行标记的良好解决方案

MongoDB - 从单个数组元素中取消设置属性