mongodb在更新时未移除空字段

时间:2013-02-14 12:28:09

标签: php mongodb

目前我运行的mongo查询类似于以下内容:

$query = array(
    'user_id' => $this->getUserId(),
    'name'    => $this->getName()
);

我检查记录是否存在,如果我想更新它,如果没有创建它。

if(is_null($this->getId())) {
    $query['created'] = date('Y-m-d H:i:s');
    $this->collection->insert($query);
    $this->setId($query['_id']);
    return true;
} else {
    $conditions = array(
     '_id' => new \MongoId($this->getId())
    );
    return $this->collection->update($conditions, $query);
}

目前,如果记录是新记录,则添加'创建'日期字段。但是,当我运行更新mongoDb似乎带回正确的记录但删除创建的字段,而不是保持原样。

我已尝试将'created' => $this->getCreated()添加到 $ query 以及 $ conditions ,两者都证明不成功。是否有一些明显的我做错了导致我想要单独删除的字段?

2 个答案:

答案 0 :(得分:2)

这是因为您的$query值。这是一个常见的初学者错误。

将整个查询文档放入更新中,如下所示:

$query = array(
    'user_id' => $this->getUserId(),
    'name'    => $this->getName()
);

没有任何操作符实际上将使用此文件替换原始文档。

而是将这些字段$set改为新值,您应该使用$set

$query = array('$set' => array(
    'user_id' => $this->getUserId(),
    'name'    => $this->getName() )
);

这应该会给你你想要的效果。

答案 1 :(得分:2)

根据您的问题,我建议重新尝试“'created'=> $ this-> getCreated()到$ query”,前提是您的模型已定义了已创建的属性,并且您的getter方法正在运行,那么这应该使用插入的当前日期和更新时的预设属性值。