我在$or
操作中嵌套多个双操作数$and
操作时遇到问题。 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();
有什么想法吗?
答案 0 :(得分:11)
听起来你需要在将它添加到$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();
答案 1 :(得分:0)
您可以尝试如下:
$filters = array(
new \MongoRegex('/American/i'),
new \MongoRegex('/Mega/i')
);
$q = $doctrineOdm->createQueryBuilder('Business')
-> field('nm') ->in($filters)
-> field('dsc') ->in($filters);
print_r($q->getQuery()->getQuery()); // infinite recursion
$cursor = $q->getQuery()->execute();