使用php升级后获取mongodb_id对象
是否可以在查询后获取新的/更新的\u 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
$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对象
希望这有帮助:Dupdate方法返回一个数组,其中包含插入的文档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] =>
)