好的,这个问题让我疯狂,我认为_id本来是ObjectID,而第一次插入它时,当我尝试使用_id更新它时,它是正确的。它不起作用。
这是我的代码
//Save Data
function savedata($data){
$collection = $this->db->retail_logs;
$this->data = $data;
if($this->data['_id'] == NULL || $this->data['_id'] == "")
{
$this->data['_id'] = new MongoId();
}
else
{
$this->data['_id'] = ObjectID($this->data['_id']);
}
try {
$collection->update(
array("_id"=>$this->data['_id']),
$this->data, // new lead document to insert
array("upsert" => true, "safe" => true)
);
print $this->data['_id'];
} catch (Exception $e) {
print "we are not able to update";
}
}
我曾尝试过followinf
if($this->data['_id'] == NULL || $this->data['_id'] == "")
{
$this->data['_id'] = new MongoId();
}
else
{
$this->data['_id'] = ObjectID($this->data['_id']);
}
但似乎没有帮助。
发生的事情是它第一次正确插入ObjectID(idnumber) 然后当它进行更新时删除ObjectID()并插入一个与以前相同的idnumber的新线索
所以它看起来像“IDNUMBER”
答案 0 :(得分:2)
您的原始代码已关闭,但如果您想使字符串_id
成为正确的ObjectID类型,请使用:
$this->data['_id'] = new MongoId($this->data['_id']);
答案 1 :(得分:0)
检查更新请求的结果
非upsert更新可能会也可能不会修改现有对象。 upsert将修改现有对象或插入新对象。客户端可以通过随后发出getlasterror命令(db.runCommand(“getlasterror”))来确定其连接上的最新消息是否更新了现有对象。如果getlasterror命令的结果包含updatedExisting字段,则连接上的最后一条消息是更新请求。如果updatedExisting字段的值为true,则该更新请求导致更新现有对象;如果updatedExisting为false,则不更新现有对象。如果执行插入,则“upserted”字段将包含新的_id值(从1.5.4开始新增)
您可以按照Mongo Docs的建议运行命令,并告诉我们命令的结果