2

{LISTID:1, EMAIL:1} に一意のインデックスを持つコレクション サブスクライバーがあります。ドキュメントが存在しない場合は挿入し、既に存在する場合は更新したいのですが、挿入されているか更新されているかは関係なく、ドキュメントの _id を取得したいのです。

$mongo = new Mongo();
$db = $mongo->test; 
$collection = $db->subscribers;
$criteria = array('LISTID' => 86, 'EMAIL' => 'opp20071980@gmail.com');
$data = array('LISTID' => 86, 'EMAIL' => 'opp20071980@gmail.com', 'FNAME' => 'Oleg');
$result = $collection->update($criteria, $data, array('fsync' => true, 'upsert' => true));    
var_dump($data);
var_dump($result);

ドキュメントが挿入された場合、結果は次のようになります。

array
  'LISTID' => int 86
  'EMAIL' => string 'opp20071980@gmail.com' (length=21)
  'FNAME' => string 'Oleg' (length=4)

array
          'updatedExisting' => boolean false
          'upserted' => 
            object(MongoId)[6]
              public '$id' => string '506446e4e0dae94a0bd25d06' (length=24)
          'n' => int 1
          'connectionId' => int 10
          'fsyncFiles' => int 7
          'err' => null
          'ok' => float 1

しかし、更新された場合、_id なしで結果が得られます。

array
  'LISTID' => int 86
  'EMAIL' => string 'opp20071980@gmail.com' (length=21)
  'FNAME' => string 'Oleg' (length=4)
array
  'updatedExisting' => boolean true
  'n' => int 1
  'connectionId' => int 10
  'fsyncFiles' => int 7
  'err' => null
  'ok' => float 1

レコードが更新されても挿入されていない場合でも _id を取得する方法を教えてください。

4

2 に答える 2

2

ここでの問題はMongoCollection.update()_id(のようにMongoCollection.insert()

データベースに一致するものがなく、がある場合upsert=>trueid、オブジェクト内に が表示されupsertedます。一致する場合ではありません。

findAndModify単一のドキュメントを更新または挿入する場合は、コマンドを使用できますupsert(v.1.3.0-beta で追加されたヘルパー)

$mongo = new Mongo();
$db = $m->mydatabase;
$query = array('LISTID' => 86, 'EMAIL' => 'opp20071980@gmail.com');
$update = array('$set' => array('LISTID' => 86, 'EMAIL' => 'opp20071980@gmail.com', 'FNAME' => 'Oleg') );

$result = $db->command(
  array(
    "findandmodify" => "test", / /name of collection
    "query" => $query,
    "update" => $update,
    'upsert' => 1
  )
);

両方の状況での結果は異なります。こちらを参照してください。

レコードが見つかり、更新されました:

Array
(
    [value] => Array
        (
            [_id] => MongoId Object
                (
                    [$id] => 506470963e20d69457000000
                )

            [LISTID] => 86
            [EMAIL] => opp20071980@gmail.com
        )

    [lastErrorObject] => Array
        (
            [updatedExisting] => 1
            [n] => 1
        )

    [ok] => 1
)

レコードが見つかりません。挿入されました:

Array
(
    [value] => 
    [lastErrorObject] => Array
        (
            [updatedExisting] => 
            [n] => 1
            [upserted] => MongoId Object
                (
                    [$id] => 5064708213995e82a829753e
                )

        )

    [ok] => 1
)

_idfindAndModify がドキュメントを挿入または更新したかどうかに応じて、2 つの異なる場所で を取得する必要があります。

于 2012-09-27T15:32:51.947 に答える
0

$dataで変数を変更して、$set再試行してください。

$data =  array('$set' => array('LISTID' => 86, 'EMAIL' => 'opp20071980@gmail.com', 'FNAME' => 'Oleg'));
于 2012-09-27T11:56:54.660 に答える