使用php升级后获取mongodb_id对象

使用php升级后获取mongodb_id对象,php,mongodb,upsert,Php,Mongodb,Upsert,是否可以在查询后获取新的/更新的\u id? 示例代码: $key = array( 'something' => 'unique' ); $data = array( '$inc' => array( 'someint' => 1 ) ); $mongodb->db->collection->update( $key, $data, array( 'upsert' => true ) ); $key没有保存new/old _id对象,我假设$data

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

$key = array( 'something' => 'unique' );
$data = array( '$inc' => array( 'someint' => 1 ) );
$mongodb->db->collection->update( $key, $data, array( 'upsert' => true ) );
$key没有保存new/old _id对象,我假设$data也不会保存,因为它只是一条指令

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

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

PHP驱动程序没有在collection类中包含一个方便的方法(但是--请检查),但是它仍然可以使用(请注意,我的PHP很糟糕,所以我可能在下面的代码片段中犯了一个语法错误):


万一有人像我一样偶然发现这个问题,Mongo实际上会在调用MongoCollection->save();-将id追加到末尾。 因此,如果你打电话:

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

您将拥有该对象的mongo id。

您还可以在更新/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.

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

当upsert导致在集合中创建新文档时,返回的对象包含_id(以下是示例的打印):

您可以从以下位置获取_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方法返回一个数组,其中包含插入的文档ID:


啊-查找和修改
我很少使用它,我总是忘记它的存在:)-偶尔被证明是错的很好;)@格纳夫:不用担心。让我感到奇怪的是,在PHP中没有一种自动获取_id的方法——我已经习惯了Python驱动程序,这些驱动程序会在每种情况下返回_id。我看不出使用过于复杂的
find和modify
而不是传统的
save
没有任何意义,如果它是一个标准的、没有虚饰的,
upsert
。啊哈!我想知道为什么没有一种方法来获取PHP中upsert的
\u id
。。。这应该是公认的答案。
$id = (string)$obj['upserted'];
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));
}
Array
(
    [ok] => 1
    [nModified] => 0
    [n] => 1
    [err] => 
    [errmsg] => 
    [upserted] => MongoId Object
        (
            [$id] => 5511da18c8318aa1701881dd
        )
    [updatedExisting] => 
)