1

您能否告诉是否可以使用批量删除来获取插入文档的数量?对于某些人来说,因为 batchInsert 它总是返回: array 'err' => null 'n' => int 0 'ok' => float 1

使用 mongodb shanty 的代码是这样的:

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

2 回答 2

2

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

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

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

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

  2. 不,您不能进行批量更新插入。要执行 upsert(如果丢失则创建,否则更新),您必须使用将标志设置为 true的update方法。upsert

  3. 这张票并不是严格意义上的batchInsert,不——所有insert命令当前在getLastError结果中都返回 n==0 。

于 2012-04-04T15:43:00.907 回答
1

我知道我的回答可能有点晚了——但谁知道呢,它可以帮助别人。

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

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

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

此函数的好处是它返回插入文档的实际数量,从而消除了删除的重复文档(使用ensureIndexand 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);
于 2013-05-15T09:06:05.553 回答