使用批量插入插入的文档数

时间:2012-04-04 12:56:09

标签: php mongodb

请问您是否可以使用批量删除来获取插入文档的数量? 对于某些人来说,原因是batchInsert它总是返回: 排列   'err'=>空值   'n'=> int 0   'ok'=>漂浮1

使用mongodb shanty代码是这样的:

$result = Model_Mongodb::insertBatch($importData, array('safe' => true));

2 个答案:

答案 0 :(得分:2)

不幸的是,MongoDB不会返回插入操作插入的文档数。这是一个已知问题 - 请参阅https://jira.mongodb.org/browse/SERVER-4381,如果这对您的用例很重要,请投票支持该问题。

但是,我会注意到,如果您使用insertBatch安全模式并且没有收到错误结果,您可能会认为所有文档都已成功插入。

编辑(回答评论中的问题):

  1. 默认情况下,如果出现错误,批量插入会停止(并在返回结果中返回错误信息)。您可以使用continueOnError标志在MongoDB 2.0+中覆盖此行为,在这种情况下,返回结果将仅提供有关上一个错误的信息;不会报告任何早期错误。

  2. 不,你不能做一个批量upsert。要进行upsert(如果缺少则创建,否则更新),必须使用update方法并将upsert标志设置为true。

  3. 该票证并非严格约为batchInsert,没有 - 所有insert命令当前在getLastError结果中返回n == 0。

答案 1 :(得分:1)

我知道我的回答可能有点迟了 - 但谁知道,它可以帮助某人。

我找到了一种获取插入文档数量的黑客方法,它就像这样:

1-计数文件。
2- BatchInsert()...
3-再次计算文件。
4-用步骤1减去步骤3的结果

当然,为了有效地重用这种方法,我不得不放入一个功能,这增加了一点复杂性。

此功能的好处是它返回实际插入文档的数量,从而消除了删除的重复文档(使用ensureIndexdropDups)和未插入的文档到期错误等...

这是代码::

/**
 * 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);