如何通过PHP更新mongo中的对象

时间:2019-06-10 03:18:00

标签: php mongodb codeigniter nosql

我已经要求更新mongo中的对象(我在NoSQL中有点新),所以..我从指南中知道很多,因此,目前,我正在使用此Codeigniter MongoDB library来简化任务。< / p>

所以,这是我存储在MongoDB中的对象:

{
    "_id": ObjectID("5cfdc59844d81560d407a2e3"),
    "equipo": "2bdca4c0-854d-4f73-bca8-cfb78a31f928",
    "jugadores": {
        "5361aa85-df9c-4099-8157-fd4d558622cc": {
            "tipo": "i",
            "estado": false,
            "nombre": "name",
            "apellido_st": "last_name",
            "apellido_nd": "second_last_name",
            "email": "email@example.com"
        }
    }
}

这是我用来更新它的“查询”。

$this->mongo->where(array
(
    "equipo" => "2bdca4c0-854d-4f73-bca8-cfb78a31f928",
    "jugadores" => "5361aa85-df9c-4099-8157-fd4d558622cc"
))->set(array("estado" => true))->update("torneos_inscripciones");

很显然,..不能正常工作,我找不到原因到底是什么,estado字段没有得到更新;可能比我更简单,但无法理解。目的是根据estado uuid(在本例中为jugadores

)来更新5361aa85-df9c-4099-8157-fd4d558622cc字段

根据B. Fleming的答案,我对代码进行了更改:

$this->mongo->where(array(
    "equipo" => "2bdca4c0-854d-4f73-bca8-cfb78a31f928",
    "jugadores.5361aa85-df9c-4099-8157-fd4d558622cc" => array(
        '$exists' => true
)))->set(array("jugadores.5361aa85-df9c-4099-8157-fd4d558622cc" => array("estado" => true)))->update("torneos_inscripciones");

现在的问题是使数组为空,仅显示estado字段。

1 个答案:

答案 0 :(得分:1)

我没有太多运气为CodeIgniter方法找到任何好的文档。他们的文件很糟糕。但是据我发现,我怀疑您的问题出在您的where查询中。具体来说,您似乎在搜索键5361aa85-df9c-4099-8157-fd4d558622cc的值jugadores。此查询的问题在于5361aa85-df9c-4099-8157-fd4d558622cc是一个字段,而不是一个值,因此MongoDB和CodeIgniter都不知道如何处理此查询。

通过检查键5361aa85-df9c-4099-8157-fd4d558622cc的存在,而不是尝试将其作为值进行匹配,您可能会获得更大的成功:

$this->mongo->where(array(
    "equipo" => "2bdca4c0-854d-4f73-bca8-cfb78a31f928",
    "jugadores.5361aa85-df9c-4099-8157-fd4d558622cc" => array(
        '$exists' => true
    )
))->set(array(
    "jugadores.5361aa85-df9c-4099-8157-fd4d558622cc.estado" => true
))->update("torneos_inscripciones");

请注意,我使用的是单引号字符串,即'$exists'而不是"$exists"。这很重要,因为在PHP中,如果使用双引号字符串,则将带有前缀$的单词视为变量,并在插入字符串之前评估结果。使用单引号字符串可确保该值不会被解释为变量。