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
更新:
関数でカーソルを指定すると、エラーは表示されなくなります。しかし、ソリューションに適用せずに、ログを読み取ると、警告がランダムに表示されます。コードを数回実行すると、前述の警告が報告され、他の人が報告しない場合があります。
どうして?
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ドライバーの最新バージョンで最新であるかどうかはわかりません。
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 ]);
最新のMongoDBマニュアルから、集約操作が変更されました。
MongoDB 3.4は、パイプラインにexplainオプションが含まれていない限り、カーソルオプションなしのaggregateコマンドの使用を非推奨にします。集計コマンドを使用して集計結果をインラインで返す場合は、デフォルトのバッチサイズカーソル{}を使用してカーソルオプションを指定するか、カーソルオプションカーソル{batchSize:}でバッチサイズを指定します。
2番目のパラメーターがこれを解決するので、[ "cursor" => [ "batchSize" => 0 ] ]
を追加して、関数呼び出しにそのパラメーターを指定するだけです。 ここ を参照してください。
カーソルパラメータの使用法については、このSO質問を参照することもできます。
これを置き換えます:
$ this-> db-> {$ collection}-> Aggregate($ options);
以下のコードでカーソル配列を追加します。
$ this-> db-> {$ collection}-> Aggregate($ options、array( 'cursor' => array( 'batchSize' => 1)));
最新の MongoDB PHP Library を使用していると仮定すると、'useCursor' => false
オプション(デフォルトはtrue
)を次のように渡すことができるはずです。 doc で説明されています。
ドライバーmongo
は非推奨であり、最新のPHPメジャーリリース(PHP 7など)をサポートしていません。
mongodb
http://php.net/manual/en/set.mongodb.php という名前の新しいドライバー