您能否告诉是否可以使用批量删除来获取插入文档的数量?对于某些人来说,因为 batchInsert 它总是返回: array 'err' => null 'n' => int 0 'ok' => float 1
使用 mongodb shanty 的代码是这样的:
$result = Model_Mongodb::insertBatch($importData, array('safe' => true));
不幸的是,MongoDB 不返回插入操作插入的文档数。这是一个已知问题 - 请参阅https://jira.mongodb.org/browse/SERVER-4381,如果这对您的用例很重要,请投票支持该问题。
但是,我会注意,如果您使用insertBatch
安全模式并且没有得到错误结果,您可能会认为所有文档都已成功插入。
编辑(回答评论中的问题):
默认情况下,如果出现错误,批量插入将停止(并在返回结果中返回错误信息)。您可以在 MongoDB 2.0+ 中使用标志覆盖此行为continueOnError
,在这种情况下,返回结果将仅提供有关最后一个错误的信息;不会报告任何早期的错误。
不,您不能进行批量更新插入。要执行 upsert(如果丢失则创建,否则更新),您必须使用将标志设置为 true的update
方法。upsert
这张票并不是严格意义上的batchInsert
,不——所有insert
命令当前在getLastError
结果中都返回 n==0 。
我知道我的回答可能有点晚了——但谁知道呢,它可以帮助别人。
我找到了一种获取插入文档数量的黑客方法,它是这样的:
1-计数文件。
2- BatchInsert()...
3- 再次计数文档。
4- 用第 1 步减去第 3 步的结果
当然,为了有效地重用这种方法,我不得不放入一个函数,这增加了一点复杂性。
此函数的好处是它返回插入文档的实际数量,从而消除了删除的重复文档(使用ensureIndex
and 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);