获取我们插入的mongodb文件的_id(如果它不存在),如果它已经存在则更新

时间:2012-09-27 11:31:33

标签: php mongodb mongodb-php

我有一个在{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?

2 个答案:

答案 0 :(得分:2)

此处的问题是MongoCollection.update()不会返回_id(就像MongoCollection.insert()

如果数据库中没有匹配且您有upsert=>true,则id对象中会出现upserted。如果 匹配则不会。

如果您要更新或插入单个文档,可以使用 findAndModify 命令upsert(在v.1.3.0-beta中添加帮助程序)< / p>

$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
)

根据findAndModify是否插入或更新文档,您必须在两个不同的地方获取_id

答案 1 :(得分:0)

使用$data更改$set变量,然后重试。

$data =  array('$set' => array('LISTID' => 86, 'EMAIL' => 'opp20071980@gmail.com', 'FNAME' => 'Oleg'));