【问题标题】:Using options in MongoDB\Driver\Query使用 MongoDB\Driver\Query 中的选项
【发布时间】:2018-02-19 12:02:07
【问题描述】:

我正在尝试使用 MongoDB\Driver\Query 中的选项:

$options = array();
...
if (isset($limit['page']))
    {$options['skip']=($limit['page'] - 1) * $limit['hpp'];}//20
if (isset($limit['hpp']))
    {$options['limit']=$limit['hpp'];//20
    $options['batchSize']=$limit['hpp'];}//20
print('<br />--------$options :<br />');
print_r($options);
$query = new MongoDB\Driver\Query($search, $options);
print('<br />********$query :<br />');
echo '<pre>';
print_r($query);
echo  '</pre>';

如果 $options 看起来没问题:

--------$选项:
数组 ( [排序] => 数组 ( [_id] => 1 ) [跳过] => 20 [限制] => 20 [batchSize] => 20 )

$query 没有给我很好的选择:

********$query :  
MongoDB\Driver\Query Object  
(  
[query] => stdClass Object  
    (  
        [$orderby] => stdClass Object  
            (  
                [_id] => 1  
            )  
         [$query] => stdClass Object  
            (  
            )  
     )  
[selector] =>  
[flags] => 0  
[skip] => 20  
[limit] => 0  
[batch_size] => 0  
[readConcern] =>  
)

limit 和batch_size 不等于20,为什么?请问该怎么做?

提前致谢

【问题讨论】:

  • 查询对象看起来很旧。类似于 v1.0 的驱动程序。您使用的是什么版本? php、mongodb和驱动程序。
  • 为什么老? php7, mongodb 1.2.6 驱动=?
  • 查询应该类似于filter=&gt;Object, options=&gt;Object, readConcern=&gt;Object,请参阅 SaschaM78 的回答。您的 print_r($query); 在顶层返回选项,而不是在选项对象内。 IIRC 很久以前就这样了。

标签: php database mongodb


【解决方案1】:

在 PHP 7.2.2 上测试:

<?php
$options= [
    'skip' => 20,
    'limit' => 20,
    'batchSize' => 20   
];

$filter= [
'_id' => '5a8adcf335f6d112d00e46c8'
];

$query= new MongoDB\Driver\Query($filter, $options);
print_r($query);

输出:

MongoDB\Driver\Query 对象 ( [过滤器] => 标准类对象 ( [_id] => 5a8adcf335f6d112d00e46c8 )

 [options] => stdClass Object
    (
        [batchSize] => 20
        [skip] => 20
        [limit] => 20
    )

[readConcern] =>  )

解决方案(取自 cmets)

作为options 传递给查询实例的参数以类型敏感的方式处理,在作者的情况下,参数是从用户输入传递的,并作为“字符串”而不是“数字”作为例外传输。解决方案是在解决问题的参数上使用intval()

如果事情仍然没有按预期工作 - 更新 MongoDB

我检查了MongoDB PECL repo 的更新日志,但找不到修复错误的时间。我建议更新到the most current version 并再次测试。

【讨论】:

  • 谢谢,好吧,如果我写 $options= [ 'skip' => 20, 'limit' => 20, 'batchSize' => 20 ];没关系:[flags] => 0 [skip] => 20 [limit] => 20 [batch_size] => 20 但我不明白为什么我的第一次尝试不起作用...
  • 我只能假设这是由于您的变量是从用户输入(即作为 GET 或 POST 参数提供)而不是静态设置值初始化的。您能否发布var_dump($options); 的输出,然后将代码更改为使用intval($limit['hpp']); 并重试?
  • 谢谢,intval() 工作 :) 没有它,var_dump 给出:array(4) { ["sort"]=> array(1) { ["_id"]=> int(1) } ["skip"]=> int(20) ["limit"]=> string(2) "20" ["batchSize"]=> string(2) "20" }... 字符串不是我的朋友们。再次感谢
  • 不客气,很好用!并感谢您的接受!我将在我的答案中添加最终解决方案,也许其他人也会对此感到失望:-)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-24
  • 1970-01-01
  • 2021-04-28
  • 1970-01-01
相关资源
最近更新 更多