Mongodb 在 PHP 中查找具有多个条件的查询

Mongodb find query with mutiple conditions in PHP

我有三个工作查询:

  1. 查找标题字段中包含关键字的行

    $cursor = $collection->find(['title' => array('$regex'=>new MongoRegex($title_query))])->sort(array('timestamp'=>-1));
    
  2. 查找作者字段中有关键字的行

    $cursor = $collection->find(['author' => array('$regex'=>new MongoRegex($author_query))])->sort(array('timestamp'=>-1));
    
  3. 查找日期范围内的行

    $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 查询运算符。让我们重写原来的三个查询:

  1. 标题匹配关键字,按时间降序排列:

    $collection->find([
      'title' => new MongoRegex($title_query),
    ])->sort(['timestamp' => -1]);
    
  2. 作者匹配关键词,按时间降序排列:

    $collection->find([
      'author' => new MongoRegex($author_query),
    ])->sort(['timestamp' => -1]);
    
  3. 日期范围内匹配,按时间降序排列:

    $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 查询运算符(请参阅一些用例的示例);然而,在上面的示例中,条件非常简单,您可以简单地组合数组。