请问您是否可以使用批量删除来获取插入文档的数量? 对于某些人来说,原因是batchInsert它总是返回: 排列 'err'=>空值 'n'=> int 0 'ok'=>漂浮1
使用mongodb shanty代码是这样的:
$result = Model_Mongodb::insertBatch($importData, array('safe' => true));
答案 0 :(得分:2)
不幸的是,MongoDB不会返回插入操作插入的文档数。这是一个已知问题 - 请参阅https://jira.mongodb.org/browse/SERVER-4381,如果这对您的用例很重要,请投票支持该问题。
但是,我会注意到,如果您使用insertBatch
安全模式并且没有收到错误结果,您可能会认为所有文档都已成功插入。
编辑(回答评论中的问题):
默认情况下,如果出现错误,批量插入会停止(并在返回结果中返回错误信息)。您可以使用continueOnError
标志在MongoDB 2.0+中覆盖此行为,在这种情况下,返回结果将仅提供有关上一个错误的信息;不会报告任何早期错误。
不,你不能做一个批量upsert。要进行upsert(如果缺少则创建,否则更新),必须使用update
方法并将upsert
标志设置为true。
该票证并非严格约为batchInsert
,没有 - 所有insert
命令当前在getLastError
结果中返回n == 0。
答案 1 :(得分:1)
我知道我的回答可能有点迟了 - 但谁知道,它可以帮助某人。
我找到了一种获取插入文档数量的黑客方法,它就像这样:
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);