2013-04-10 35 views
2

當更改某個文檔(不確定結構究竟如何)時,我想在另一個集合中創建該文檔的備份,然後將其保存回當前集合。做備份,我想這一點:PHP在MongoDB中複製文檔,替換它的MongoID

$mongoDbObj = $collection->findOne($filter); 
... 
$collectionBackup->insert($mongoDbObj,true); 

...但是這隻能一次因爲MongoID被複制。當我嘗試再次備份同一文檔時,MongoID已經存在於backupCollection中。所以我的問題是:

我可以複製一個MongoDB文檔在PHP中,用新的MongoID覆蓋MongoID,然後插入到另一個集合中,而不更改原始文檔的MongoID?


這個問題簡化爲:我怎樣才能做到這一點:

$mongoDbObj = $collection->findOne($filter); 
... 
$collectionBackup->insert($mongoDbObj,true); 
// change MongoId so the next line doesn't throw exception 
$collectionBackup->insert($mongoDbObj,true); 
// save my object back with the original MongoID 
$collection->save($mongoDbObj); 

也有利於將如何克隆/複製MongoDB的文檔,那麼這將是容易解決的問題只需在複製的文檔中添加一個新的MongoID即可。

回答

1
$mongoDbObj = $collection->findOne($filter); 
$mongoDbObjBak = array(); 

foreach($mongoDbObj as $key => $value) { 
    if($key != '_id') { 
     $mongoDbObjBak[$key] = $value; 
    } 
} 

$collectionBackup->insert($mongoDbObjBak,true); 
$collection->save($mongoDbObj); 
+0

好一點:一個MongoDB的文件僅僅是一個PHP數組,這樣你就可以像這樣對待它。謝謝!順便說一下:Tobias,歡迎來到Stackoverflow! – Akku 2013-04-12 04:45:13

1

所以你要副本的文件,並複製它的其他集合在沒有_id蒙戈。

使用欄位查詢以便刪除欄位你不需要。

例子:

$mongoDbObj = $collection->findOne($filter); 
$mongoDbObj->fields(array("_id" => false)); 

文檔:http://www.php.net/manual/en/mongocursor.fields.php

玩得開心:)