我有一个在{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?
答案 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'));