如何在mongoDb PHP中替换除BulkWrite操作中的id之外的所有值?

问题描述 投票:0回答:1

如何在mongoDb PHP中替换除BulkWrite操作中的id之外的所有值?

下面我尝试使用简单的collection-> updateOne(....)。但BulkWrite->更新也不起作用。我主要需要在同一个id,全新值上使用BulWrite,因为新值是非常大的嵌套数组,并且显式设置每个值没有意义。

这篇文章说我应该在保存的值中明确设置id,这应该覆盖前一个实体。但这对我不起作用。 MongoDB : update entire document except _id using C# driver

$mgm = new MongoDB\Driver\Manager( "mongodb://localhost:27017" ); // $connectionUri,$connectionOptions
$mgc = new MongoDB\Client();
$mgbw = new MongoDB\Driver\BulkWrite();   
$mgc_IS = $mgc->selectCollection( 'db', 'collection', [] ); 

$ust = $mgc_IS->findOne([ 'alias'=> '2121515456' ]);
echo "<br> us!==null" .  ( $ust!==null );
if( $ust!==null ) {
    $_id = $ust->_id;
    var_dump( $ust ); // MongoDB\Model\BSONDocument  // var_dump( $ust->toArray()  will not work on BSONDocument
    $ustA = $ust->getArrayCopy();
    foreach ( $ustA as $k=>$v ) {
        if( is_scalar($v) ) { $ustA[$k]='neValue'; }
        else if ( is_array($v) ) { $ustA[$k] = [ 'a'=>1, 'n'=>2, 'c'=>3 ]; }
    } // foreach ( $ustA as $k=>$v ) 
    $ustA['alias']= '2121515456';
    $ustA['_id']= $_id;
    $ust_id = $mgc_IS->updateOne( [ '_id'=>$_id ] , [ '$set'=>$ustA], [ 'multi' => false, 'upsert' => true ] ); 
    $ust2 = $mgc_IS->findOne([ 'alias'=>'2121515456' ]);  
    var_dump( $ust2 ); //contains the same objcet  + new values 
} // if($ust!==null) 
php mongodb bulkinsert
1个回答
0
投票

其实我很抱歉这个问题,似乎很累。为了替换除id之外的所有值,必须使用replace方法。替换操作与更新操作类似,但是替换操作不是更新文档以包括新字段或新字段值,而是用新文档替换整个文档,但保留原始文档的_id值。

https://docs.mongodb.com/php-library/master/tutorial/crud/#replace-documents https://docs.mongodb.com/php-library/master/reference/method/MongoDBCollection-bulkWrite/index.html

MongoDB\Collection::replaceOne
MongoDB\Collection::findOneAndReplace
MongoDB\Collection::bulkWrite( [[ 'replaceOne' => [ $filter, $replacement, $options ] ], ]);

Alex Tatulchenkov(2016)的这篇文章非常有用:https://medium.com/@webtota/php7-and-mongodb-madness-148cfc30bc5b

© www.soinside.com 2019 - 2024. All rights reserved.