在MongoDB中复制一个文档,将其替换为'


PHP Copy a document in MongoDB, replacing it's MongoID

当更改某个文档时(不确定结构究竟如何),我想在将该文档保存回当前集合之前在另一个集合中创建该文档的备份。为了进行备份,我尝试这样做:

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

…但是这只工作一次,因为MongoID被复制了。当我尝试再次备份同一文档时,MongoID已经存在于backupCollection中。所以我的问题是:

我可以在PHP中复制MongoDB文档,用新的MongoID覆盖MongoID,然后插入到另一个集合中,而不改变原始文档的MongoID ?


这个问题简化为: How can I do This

$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来解决问题。

$mongoDbObj = $collection->findOne($filter);
$mongoDbObjBak = array();
foreach($mongoDbObj as $key => $value) {
    if($key != '_id') {
        $mongoDbObjBak[$key] = $value;
    }
}
$collectionBackup->insert($mongoDbObjBak,true);
$collection->save($mongoDbObj);

所以你想复制一个文档,并复制它在另一个集合没有_id mongo。

使用字段查询来删除不需要的字段

的例子:

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

Docs: http://www.php.net/manual/en/mongocursor.fields.php

玩得开心点