Mongodb 在 PHP 中查找具有多个条件的查询
Mongodb find query with mutiple conditions in PHP
我有三个工作查询:
查找标题字段中包含关键字的行
$cursor = $collection->find(['title' => array('$regex'=>new MongoRegex($title_query))])->sort(array('timestamp'=>-1));
查找作者字段中有关键字的行
$cursor = $collection->find(['author' => array('$regex'=>new MongoRegex($author_query))])->sort(array('timestamp'=>-1));
查找日期范围内的行
$rangeQuery = array('timestamp' => array( '$gte' => $from_Id, '$lte' => $to_Id ));
$cursor = $collection->find($rangeQuery)->sort(array('timestamp'=>-1));
我想将查询合并为 1&2、1&3 和 2&3。但是我无法编写正确的查询...
这是我对组合 1 和 2 的查询:
$cursor = $collection->find('title' => array('$regex'=>new MongoRegex($title_query)),
'author' => array('$regex'=>new MongoRegex($author_query)))->sort(array('timestamp'=>-1));
合并 1 和 3 的查询:
$rangeQuery = array('timestamp' => array( '$gte' => $from_Id, '$lte' => $to_Id ));
$cursor = $collection->find($rangeQuery, ['title' => array('$regex'=>new MongoRegex($title_query))])->sort(array('timestamp'=>-1));
谁能告诉我如何编写正确的查询?
如果您使用的是 BSON 正则表达式类型(即 PHP driver 中的 MongoRegex),则不需要 $regex
查询运算符。让我们重写原来的三个查询:
标题匹配关键字,按时间降序排列:
$collection->find([
'title' => new MongoRegex($title_query),
])->sort(['timestamp' => -1]);
作者匹配关键词,按时间降序排列:
$collection->find([
'author' => new MongoRegex($author_query),
])->sort(['timestamp' => -1]);
日期范围内匹配,按时间降序排列:
$collection->find([
'timestamp' => [
'$gte' => $from_Id,
'$lte' => $to_Id,
],
])->sort(['timestamp' => -1]);
您在 OP 中共享的组合查询示例中存在多个错误。对于“1&2”查询,您没有将数组作为第一个参数传递给 find()
,因此这将是一个语法错误。对于“1&3”查询,您仅将时间戳范围作为 find()
条件传递,并且标题正则表达式作为第二个 find()
参数传递不正确,该参数保留用于指定项目(即return).
的字段
组合三个查询实际上就像合并条件数组一样简单。例如,我们可以像这样组合所有三个:
$collection->find([
'title' => new MongoRegex($title_query),
'author' => new MongoRegex($author_query),
'timestamp' => [
'$gte' => $from_Id,
'$lte' => $to_Id,
],
])->sort(['timestamp' => -1]);
在某些情况下,无法合并同一字段的条件。出于这个原因,MongoDB 有一个 $and
查询运算符(请参阅一些用例的示例);然而,在上面的示例中,条件非常简单,您可以简单地组合数组。
我有三个工作查询:
查找标题字段中包含关键字的行
$cursor = $collection->find(['title' => array('$regex'=>new MongoRegex($title_query))])->sort(array('timestamp'=>-1));
查找作者字段中有关键字的行
$cursor = $collection->find(['author' => array('$regex'=>new MongoRegex($author_query))])->sort(array('timestamp'=>-1));
查找日期范围内的行
$rangeQuery = array('timestamp' => array( '$gte' => $from_Id, '$lte' => $to_Id )); $cursor = $collection->find($rangeQuery)->sort(array('timestamp'=>-1));
我想将查询合并为 1&2、1&3 和 2&3。但是我无法编写正确的查询...
这是我对组合 1 和 2 的查询:
$cursor = $collection->find('title' => array('$regex'=>new MongoRegex($title_query)),
'author' => array('$regex'=>new MongoRegex($author_query)))->sort(array('timestamp'=>-1));
合并 1 和 3 的查询:
$rangeQuery = array('timestamp' => array( '$gte' => $from_Id, '$lte' => $to_Id ));
$cursor = $collection->find($rangeQuery, ['title' => array('$regex'=>new MongoRegex($title_query))])->sort(array('timestamp'=>-1));
谁能告诉我如何编写正确的查询?
如果您使用的是 BSON 正则表达式类型(即 PHP driver 中的 MongoRegex),则不需要 $regex
查询运算符。让我们重写原来的三个查询:
标题匹配关键字,按时间降序排列:
$collection->find([ 'title' => new MongoRegex($title_query), ])->sort(['timestamp' => -1]);
作者匹配关键词,按时间降序排列:
$collection->find([ 'author' => new MongoRegex($author_query), ])->sort(['timestamp' => -1]);
日期范围内匹配,按时间降序排列:
$collection->find([ 'timestamp' => [ '$gte' => $from_Id, '$lte' => $to_Id, ], ])->sort(['timestamp' => -1]);
您在 OP 中共享的组合查询示例中存在多个错误。对于“1&2”查询,您没有将数组作为第一个参数传递给 find()
,因此这将是一个语法错误。对于“1&3”查询,您仅将时间戳范围作为 find()
条件传递,并且标题正则表达式作为第二个 find()
参数传递不正确,该参数保留用于指定项目(即return).
组合三个查询实际上就像合并条件数组一样简单。例如,我们可以像这样组合所有三个:
$collection->find([
'title' => new MongoRegex($title_query),
'author' => new MongoRegex($author_query),
'timestamp' => [
'$gte' => $from_Id,
'$lte' => $to_Id,
],
])->sort(['timestamp' => -1]);
在某些情况下,无法合并同一字段的条件。出于这个原因,MongoDB 有一个 $and
查询运算符(请参阅一些用例的示例);然而,在上面的示例中,条件非常简单,您可以简单地组合数组。