一括削除を使用して挿入されたドキュメントの数を取得できるかどうか教えてください。一部の場合、batchInsert が常に返す理由: array 'err' => null 'n' => int 0 'ok' => float 1
コードは、mongodb シャンティを使用した次のようなものです。
$result = Model_Mongodb::insertBatch($importData, array('safe' => true));
残念ながら、MongoDB は、挿入操作によって挿入されたドキュメントの数を返しません。これは既知の問題です。https://jira.mongodb.org/browse/SERVER-4381を参照してください。これがユース ケースにとって重要である場合は、問題に投票してください。
ただし、insertBatch
セーフモードで使用していてエラー結果が得られない場合は、すべてのドキュメントが正常に挿入されたと見なされる可能性があることに注意してください。
編集(コメントからの質問に答えるため):
デフォルトでは、エラーが発生すると一括挿入が停止します (戻り結果でエラー情報が返されます)。MongoDB 2.0 以降では、continueOnError
フラグを使用してこの動作をオーバーライドできます。この場合、返される結果は最後のエラーに関する情報のみを提供します。それ以前のエラーは報告されません。
いいえ、一括アップサートはできません。アップサート (欠落している場合は作成、そうでない場合は更新) を実行するには、フラグを true に設定してupdate
メソッドを使用する必要があります。upsert
そのチケットは、厳密にはbatchInsert
, no に関するものではありません。現在、すべてのinsert
コマンドが結果で n==0 を返しますgetLastError
。
私の答えは少し遅れるかもしれませんが、誰かを助けることができるかもしれません.
挿入されたドキュメントの数を取得するハックっぽい方法を見つけました。次のようになります。
1- ドキュメントを数えます。
2- BatchInsert()...
3- 再度ドキュメントをカウントします。
4- ステップ 1 でステップ 3 の結果を減算
もちろん、この方法を効果的に再利用するには、関数を追加する必要があり、これにより少し複雑になりました。
この関数の利点は、挿入されたドキュメントの実際の数を返すことです。これにより、削除された重複ドキュメント ( と を使用) や、エラーなどにより挿入されなかったドキュメントが排除されensureIndex
ますdropDups
。
コードは次のとおりです::
/**
* A hack for batchInsert() function to count inserted documents.
* PHP 5.3+ is required for callback functions.
* @param MongoDBCollection $collection
* @param callable $batchInsertFunction The actual batchInsert code.
* @return int Number of inserted documents.
*/
function countedBatchInsert($collection, $batchInsertFunction)
{
//Count current documents (before inserting)
$countDocuments['before'] = $collection->count();
//Execute batchInsert
$batchInsertFunction();
//Count documents again.
$countDocuments['after'] = $collection->count();
//Simple arithmetic operation to determine the number of inserted documents.
return $countDocuments['after'] - $countDocuments['before'];
}
例を次に示します。
/*Example*/
//Specify collection.
$collection = $this->myDatbase->myCollection;
//Data to batchInsert
$batchData = /*Array of stuff*/
//Create callback function.
$batchInsertFunction = function() use ($collection, $batchData)
{
//Do the actual batchInsert
$collection->batchInsert($batchData, $myOptions);
}
//call countBatchInsert().
countBatchInsert($collection, $batchInsertFunction);