web-dev-qa-db-ja.com

PHP MongoDB-カーソルオプションなしでのaggregateコマンドの使用は非推奨です。何ですか?

Mongoを更新しましたが、ログに次のエラーが表示されます:カーソルオプションなしでのaggregateコマンドの使用は非推奨です

現在の使用法は非推奨であるため、Mongoは集計関数に2番目のREQUIREDパラメーターを配置する必要があると言っています。

私は現在、次のコードを使用していますPHP(現在は非推奨):

$this->db->{$collection}->aggregate($options);

そして、このフォーマットを返します:

{"result":[
    {
    "_id":"xxxxxx",
    "update":[
    {
    "firstUpdateTime":xxxxxx,
    "updateTime":xxxxxxx,
    }
    ],
    "media":[
    {
    "xxxx":{ ...

非推奨のコードを使用しないために、新しい2番目のパラメーターを追加します(ただし、何を入力すればよいかわかりません):

$this->db->{$collection}->aggregate($options, array('cursor' => array('batchSize' => 101)));

そして、これは同じ情報を返しますが、初期構造が異なります。

{"cursor":{
"id":{
"value":"xxxxxx"
},
"ns":"xxxxxx.instagram",
"firstBatch":[
{
"_id":"xxxxxx",
"update":[
{
"firstUpdateTime":xxxxxx,
"updateTime":xxxxxx,
}
],
"media":[
{
"xxxxxx":{ ...

更新後、Mongoはデータの読み取り方法を変更するように強制します。 「カーソル」と呼ばれる2番目のパラメータにどのような値を入れるべきかわかりません...

その2番目のパラメーターに何を入力する必要がありますか?結果の構造を変更せずにデフォルト値を設定できますか?

Doc: https://docs.mongodb.com/manual/reference/method/db.collection.aggregate/http://php.net/manual/es/mongocollection.aggregate .php

更新:

関数でカーソルを指定すると、エラーは表示されなくなります。しかし、ソリューションに適用せずに、ログを読み取ると、警告がランダムに表示されます。コードを数回実行すると、前述の警告が報告され、他の人が報告しない場合があります。

どうして?

9
ephramd

MongoDBに何かをクエリし、結果を期待する場合、cursorと呼ばれるこの変数があります。これは単にドキュメントへのポインターです。あなたは現在読んだ。これは、ブラウザのスクロールバーのようなものです。

1で行ったように、バッファbatchSizeに読み込むドキュメントの数を指定できます。

読む予定のドキュメントの量がわかっている場合に役立ちます。必要なドキュメントが10個だけの場合は、batchSize => 10を使用してすべてのドキュメントを1つのネットワークパケットで取得できます。 batchSize => 5を指定すると、予想される10個のドキュメントを取得するためにデータベースに2つのネットワークパケットが必要になるため、時間がかかります。

デフォルトのbatchSizeを使用しても安全です。

ドキュメントの例のように、foreachを使用してカーソルを反復処理することができます: http://php.net/manual/en/class.mongocommandcursor.php

Php.netのドキュメントがMongoDBドライバーの最新バージョンで最新であるかどうかはわかりません。

5
Daniel W.

aggregateCursorのみではなく、カーソル行を返すresultsを使用する必要があります。

何かのようなもの

最初のバッチはデフォルトで101件に設定されています。

$cur = $this->db->{$collection}->aggregateCursor($pipeline);

後続のバッチの集計カーソル50にbatchsize(質問の2番目のパラメーター)を設定します。以下のオプションを使用しない場合、デフォルトでは約4MBがフェッチされます。

$cur->batchSize( 50 );

これで、結果を繰り返して読み取り、すべてのドキュメントを取得できます。

サーバーは、最初のループ反復で101ドキュメントの初期(最初の)バッチをフェッチし、続いて102反復で後続のバッチをフェッチし、カーソルがなくなるまで残りのバッチで50の間隔でフェッチします。

foreach ( $cur as $result )
{
   echo $result['_id'], "\n";
}

最初のバッチのバッチサイズを制御するには、カーソルオプションとしてbatchSizeを指定できますが、通常は必要ありません。

$cur = $this->db->{$collection}->aggregateCursor($pipeline, 'cursor' => [ 'batchSize' => 1 ]);

参照: https://derickrethans.nl/aggregation-cursor.html

2
user2683814

最新のMongoDBマニュアルから、集約操作が変更されました。

カーソルなしで集計

MongoDB 3.4は、パイプラインにexplainオプションが含まれていない限り、カーソルオプションなしのaggregateコマンドの使用を非推奨にします。集計コマンドを使用して集計結果をインラインで返す場合は、デフォルトのバッチサイズカーソル{}を使用してカーソルオプションを指定するか、カーソルオプションカーソル{batchSize:}でバッチサイズを指定します。

2番目のパラメーターがこれを解決するので、[ "cursor" => [ "batchSize" => 0 ] ]を追加して、関数呼び出しにそのパラメーターを指定するだけです。 ここ を参照してください。

カーソルパラメータの使用法については、このSO質問を参照することもできます。

2
Kris Roofe

これを置き換えます:
$ this-> db-> {$ collection}-> Aggregate($ options);

以下のコードでカーソル配列を追加します。
$ this-> db-> {$ collection}-> Aggregate($ options、array( 'cursor' => array( 'batchSize' => 1)));

1
Prajakta Pawar

最新の MongoDB PHP Library を使用していると仮定すると、'useCursor' => falseオプション(デフォルトはtrue)を次のように渡すことができるはずです。 doc で説明されています。

1
Yohanes Gultom

ドライバーmongoは非推奨であり、最新のPHPメジャーリリース(PHP 7など)をサポートしていません。

mongodbhttp://php.net/manual/en/set.mongodb.php という名前の新しいドライバー

1
Hett