11

クエリの後に新しい/更新された _id を取得することは可能ですか? コード例:

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

$key は新しい/古い _id オブジェクトを保持していません。$data は単なる命令であるため、どちらも保持しないと思います。

4

6 に答える 6

16

はい -- 単一のクエリを使用して可能です。

MongoDB にはfindAndModify、ドキュメントをアトミックに変更して返すことができるコマンドが含まれています (デフォルトでは、変更前のドキュメントを実際に返します)。

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'];
于 2010-12-13T23:30:23.347 に答える
15

私のように誰かがこの質問に出くわした場合に備えて、MongoCollection->save(); を呼び出すと、Mongo は実際に入力配列を変更します。- ID を末尾に追加します。したがって、次のように呼び出す場合:

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

そのオブジェクトの mongo ID を取得します。

于 2011-01-27T04:58:42.090 に答える
3

私はこの問題に遭遇し、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 が含まれません。

于 2012-10-04T17:56:41.047 に答える
1

update メソッドは、UPSERTED されたドキュメントの ID を持つ配列を返します。

Array
(
    [ok] => 1
    [nModified] => 0
    [n] => 1
    [err] => 
    [errmsg] => 
    [upserted] => MongoId Object
        (
            [$id] => 5511da18c8318aa1701881dd
        )
    [updatedExisting] => 
)
于 2015-03-24T22:13:49.113 に答える
0

update/upsert で fsync を true に設定して、update に渡されたオブジェクトに返される _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.
于 2012-06-21T07:17:56.700 に答える