繁体   English   中英

使用php upsert后得到mongodb _id对象

[英]get mongodb _id object after upsert with php

是否可以在查询后获取新的/更新的_id? 示例代码:

$key = array( 'something' => 'unique' );
$data = array( '$inc' => array( 'someint' => 1 ) );
$mongodb->db->collection->update( $key, $data, array( 'upsert' => true ) );

$ key没有持有新的/旧的_id对象,我认为$ data也不会因为它只是一个指令。

是的 - 可以使用单个查询。

MongoDB包含一个findAndModify命令,它可以自动修改文档并将其返回(默认情况下,它实际上会在文档被修改之前返回)。

PHP驱动程序在集合类上没有包含一个方便的方法(但是 - 看看这个bug ),但它仍然可以使用(请注意我的PHP很糟糕,所以我很可能会出现语法错误在以下代码段中:

$key = array( 'something' => 'unique' );
$data = array( '$inc' => array( 'someint' => 1 ) );
$result = $mongodb->db->command( array(
    'findAndModify' => 'collection',
    'query' => $key,
    'update' => $data,
    'new' => true,        # To get back the document after the upsert
    'upsert' => true,
    'fields' => array( '_id' => 1 )   # Only return _id field
) );
$id = $result['value']['_id'];

为了防止有人像我一样偶然发现这个问题,Mongo实际上会在你调用MongoCollection-> save()时修改输入数组; - 将id附加到最后。 所以,如果你打电话:

$test = array('test'=>'testing');
mongocollection->save($test);
echo $test['_id'];

您将拥有该对象的mongo id。

我遇到了这个问题并通过在upsert之后查询_id来解决它。 我想我会添加一些我的发现,以防它们对来这里寻找信息的人有用。

当upsert导致在集合中创建一个新文档时,返回的对象包含_id(这里是一个例子的print_r):

Array

(

[updatedExisting] => 0

[upserted] => MongoId Object
    (
        [$id] => 506dc50614c11c6ebdbc39bc
    )

[n] => 1
[connectionId] => 275
[fsyncFiles] => 7
[err] => 
[ok] => 1
)

你可以从这里得到_id:

$id = (string)$obj['upserted'];

但是,如果upsert导致现有文档被更新,则返回的对象不包含_id。

试一试:

function save($data, $id = null) {
    $mongo_id = new MongoId($id);
    $criteria = array('_id' => $mongo_id);
    // Wrap a '$set' around the passed data array for convenience
    $update = array('$set' => $data);
    $collection->update($criteria, $update, array('upsert' => true));
}

因此,假设传递的$id为null,创建了一个新的MongoId ,否则它只是将现有的$id转换为MongoId对象。

希望这会有所帮助:D

update方法返回一个数组,其中包含文档的标识为UPSERTED:

Array
(
    [ok] => 1
    [nModified] => 0
    [n] => 1
    [err] => 
    [errmsg] => 
    [upserted] => MongoId Object
        (
            [$id] => 5511da18c8318aa1701881dd
        )
    [updatedExisting] => 
)

您还可以在update / upsert中将fsync设置为true,以使_id返回到已传递给更新的对象。

$save = array ('test' => 'work');
$m->$collection->update(criteria, $save, array('fsync' => true, 'upsert' => true));
echo $save['_id']; //should have your _id of the obj just updated.

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM