Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在使用PHP/Phalcon/MongoDB插入新文档期间引用现有ObjectId_Php_Mongodb_Phalcon - Fatal编程技术网

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

在使用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

我使用下面的代码使用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);

    });
并以法尔康的方式进行了试验

$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次往返

  • 第一个用于获取parentDoc的
  • 第二个用于插入parentDoc引用Id为的secondaryDoc

  • 是否可以在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个条目的批更新语句中的所有内容来缓解异步写调用,从而执行高效的写操作,方法是不将所有内容都发送到单个语句中,而是将其分解为可管理的“批”用于服务器承诺。