1

好的,这个问题让我发疯了,我认为 _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”

4

2 回答 2

2

您的原始代码很接近,但如果您想让字符串_id成为正确的 ObjectID 类型,请使用:

$this->data['_id'] = new MongoId($this->data['_id']);
于 2012-07-26T05:08:47.913 回答
0

检查更新请求的结果

非更新插入更新可能会或可能不会修改现有对象。upsert 将修改现有对象或插入新对象。客户端可以通过随后发出 getlasterror 命令 (db.runCommand("getlasterror")) 来确定其在连接上的最新消息是否更新了现有对象。如果 getlasterror 命令的结果包含 updatedExisting 字段,则连接上的最后一条消息是更新请求。如果 updatedExisting 字段的值为 true,则该更新请求会导致更新现有对象;如果 updatedExisting 为 false,则没有更新现有对象。如果执行插入,“upserted”字段将包含新的 _id 值(从 1.5.4 开始新)

您能否按照 Mongo Docs 的建议运行命令并让我们知道命令的结果

参考:Mongo 更新

于 2012-07-26T03:57:57.577 回答