在使用PHP/Phalcon/MongoDB插入新文档期间引用现有ObjectId
我使用下面的代码使用robomongo客户端将主要类别id引用插入到次要类别文档中在使用PHP/Phalcon/MongoDB插入新文档期间引用现有ObjectId,php,mongodb,phalcon,Php,Mongodb,Phalcon,我使用下面的代码使用robomongo客户端将主要类别id引用插入到次要类别文档中 var parentDoc = db.getCollection('category').findOne({"slug":"Primary"}); db.category.insert( { "name" : "Secondary", "slug" : "secondary", "taxonomy" : true, "anc
var parentDoc = db.getCollection('category').findOne({"slug":"Primary"});
db.category.insert(
{
"name" : "Secondary",
"slug" : "secondary",
"taxonomy" : true,
"ancestors" : [
{
"_id" : parentDoc._id,
"name" : parentDoc.name
}
]
})
我已经用PHP风格尝试了下面的方法
$query = '
{
"slug" : "fashion"
}';
$primaryCategory = Category::findFirst(array(json_decode($query,true))); //phalcon code
$primary = array();
$primary['_id'] = $primaryCategory->_id;
$primary['name'] = $primaryCategory->name;
$document = array(
"name" => "Secondary2",
"slug" => "secondary",
"taxonomy" => true,
"ancestors" => array($primary)
);
$category = $app->mongo->selectCollection('category');//phalcon style of fetching collection handle
$category->insert($document);
});
并以法尔康的方式进行了试验
$query = '
{
"slug" : "fashion"
}';
$primaryCategory = Category::findFirst(array(json_decode($query,true)));
$cat = new Category(); // new secondary category
$cat->name = 'Secondary';
$cat->slug = 'secondary';
$cat->taxonomy = true;
$cat->ancestors = array();
$primary = array();
$primary['_id'] = $primaryCategory->_id;
$primary['name'] = $primaryCategory->name;
array_push ( $cat->ancestors, $primary );
$cat->save();
在上面的代码中,服务器和mongo之间有2次往返
是否可以在1次往返中执行它们,在第二次文档插入时我可以引用parentDocId您可以使用MongoDB 2.6或更高版本提供的来利用插入操作。当前的PHP驱动程序应该支持这些方法,其中特别需要类,该类扩展了用于插入操作的类。本质上,该操作可按以下方式实施:
<?php
$mc = new MongoClient("localhost");
$collection = $mc->selectCollection("test", "category");
$batch = new MongoInsertBatch($collection);
$counter = 0;
$query = array("slug" => "Primary");
foreach ($collection->find($query) as $doc ) {
$primary = array();
$primary['_id'] = $doc->_id;
$primary['name'] = $doc->name;
$doc = array(
"name" => "Secondary2",
"slug" => "secondary",
"taxonomy" => true,
"ancestors" => array($primary)
);
$batch->add($doc);
$counter++;
if ( $counter % 1000 === 0 ) {
$ret = $batch->execute(array("w" => 1));
$counter++;
$batch = new MongoInsertBatch($collection);
}
}
if ( $counter > 0 ) {
$ret = $batch->execute(array("w" => 1));
}
?>
在上面的示例中,每个
find()
查询和插入操作都通过.add()
方法添加到一个批中,并按照提供的顺序发送到服务器,以便串行执行。因此,不必等待服务器对每个插入的写入响应,操作将被批量发送和响应,因此往返开销更小。我认为这是一个很好的答案。在我的例子中,只有两个操作。所以MongoBatch操作是否会有开销,我也很想知道如果第一次操作失败,批处理是否会通过第一次操作;以及批处理操作的返回类型。我们说话的时候我正在研究。你也可以更新你的答案。谢谢这最好地解释了背后的概念,但本质上,Bulk API通过提交包含1000个条目的批更新语句中的所有内容来缓解异步写调用,从而执行高效的写操作,方法是不将所有内容都发送到单个语句中,而是将其分解为可管理的“批”用于服务器承诺。