gpt4 book ai didi

php - 在使用 PHP/Phalcon/MongoDB 插入新文档期间引用现有的 ObjectId

转载 作者:可可西里 更新时间:2023-11-01 09:41:52 26 4
gpt4 key购买 nike

我使用以下代码使用 robomongo 客户端将主要类别 ID 引用插入到次要类别文档

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

});

并尝试了 Phalcon 风格

$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. 第一个获取parentDoc
  2. 第二个用于插入带有 parentDoc 引用 Id 的 secondaryDoc

是否可以在 1 次往返中执行它们,我可以在插入 secondaryDoc 时引用 parentDocId

最佳答案

您可以通过使用 Bulk API 来利用您的插入操作 可从 MongoDB 2.6 或更高版本获得。当前的 PHP 驱动程序应该支持这些方法,特别是您需要 MongoWriteBatch 类,它扩展了 MongoInsertBatch 用于插入操作的类。本质上,该操作可以按如下方式实现:

<?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()方法添加到一个批处理中发送给服务器的,在提供顺序,用于串行执行。因此,不是等待服务器对每个插入的写入响应,而是分批发送和响应操作,从而减少往返开销。

关于php - 在使用 PHP/Phalcon/MongoDB 插入新文档期间引用现有的 ObjectId,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33257825/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com