PHP+;MongoDB动态查询-添加条件运算符

PHP+;MongoDB动态查询-添加条件运算符,php,mongodb,dynamicquery,Php,Mongodb,Dynamicquery,我在mongoDB中使用动态查询,通过以下方式使用它们: $query['clicks'] = array('$gt' => 6); $query['lang'] = "de"; $cursor = $collection->find($query); 问题非常简单明了:如何添加“或”条件?例如,将“lang”和“de”都表示为“de”或“fr” 因为现在,Mongo暗示在“点击”和“语言”之间有一个AND。那么,我如何构造单击>6&&(lang='de'| | lang='fr

我在mongoDB中使用动态查询,通过以下方式使用它们:

$query['clicks'] = array('$gt' => 6);
$query['lang'] = "de";

$cursor = $collection->find($query);
问题非常简单明了:如何添加“或”条件?例如,将“lang”和“de”都表示为“de”或“fr”


因为现在,Mongo暗示在“点击”和“语言”之间有一个AND。那么,我如何构造单击>6&&(lang='de'| | lang='fr')

您可以尝试如下

$query['clicks'] = array('$gt' => 6);
$query['$or'] = array(array('lang' => 'de'), array('lang' => 'fr'));
$cursor = $collection->find($query);
如何添加$in运算符

$query['clicks'] = array('$gt' => 6);
$query['$or'] = array(array('lang' => 'de'), array('lang' => 'fr'));
$query['_id'] = array('$in' => array(new mongoId('506d95bc5c73952c14000002'), new mongoId('506d95bc5c73952c14000003')));

$cursor = $collection->find($query);

$或
很好,但对索引不太友好,尤其是当您开始进入更多样化的范围时。在中使用
$in是一种索引友好的方法:

$db->collection->find(array('clicks' => array('$gt' => 6), 
    'lang' => array('$in' => array('fr', 'de'))));
这有时会使索引的使用更加有效

还请注意,嵌套的
$或
当前不使用索引,但是
$或
可以使用多个索引计划,这意味着类似这样的查询:

$db->collection->find(array('clicks' => array('$gt' => 6), '$or' => array(
    array('lang' => 'fr'), arrray('lang' => 'de')
))

将能够使用多个索引,但在这种情况下,它是无用的,因为它只涉及一个字段,所以最好在
中使用
$in

谢谢。为了简单起见,您得到了正确的答案。简单介绍一下:
$query['$or']=array(array('lang'=>'fr')、array('lang'=>'de');$query[''$或']=数组(数组(''u id'=>newmongoid('506D95BC5C73952C1400002'))如何将第二个“或”添加到第一个?现在的情况是,它只是覆盖了它。我知道这超出了问题的范围,但是,好吧,你想现在这样点击>6&&(lang='de'| | lang='fr'| | | | u id='506d95bc5c73952c14000002')吗?是的,但不完全是这样。我想知道如何动态添加更多ORs(我需要循环使用一些ID并添加它们。这与问题没有多大关系,但是,如果你能帮助的话,我将不胜感激。新的或不必在制动器中是必须使用的还是?你可以使用$in运算符来列出_idoh,你是对的!!不记得有$in,啊哈。谢谢你的回答!它是这对我帮助很大:)
$db->collection->find(array('clicks' => array('$gt' => 6), '$or' => array(
    array('lang' => 'fr'), arrray('lang' => 'de')
))