如何使用php更新mongodb中具有键和值的子文档

Posted

技术标签:

【中文标题】如何使用php更新mongodb中具有键和值的子文档【英文标题】:how to update sub document having key and value in mongodb using php 【发布时间】:2015-05-13 12:23:49 【问题描述】:

嗨,我是 mongodb 的新手,我在这里使用 php。我想用下面的数组将子文档更新为现有文档。

[weeksAtOne] => Array
    (
        [156] => 1586
    )

当我尝试调用以下函数时

$query = array('decade' => array('$in' => array(1980,1990)));   
$songs->update($query, 
        array('$push'=>array('weeksAtOne'=>array(156 => 500))),
        array('safe'=>true,'timeout'=>5000,'multiple'=>true))

它不会像预期的那样出现,而是会以不同的方式出现。请有人指导我这是更新此内容的正确方法。

原始数组:

Array
(
[_id] => MongoId Object
    (
        [$id] => 55004cbd30d6d48819000004
    )

[decade] => 1980
[artist] => Olivia Newton-John
[song] => Physical
[weeksAtOne] => Array
    (
        [10] => 10
        [11] => 100
        [22] => 500
    )

 )
Array
(
[_id] => MongoId Object
    (
        [$id] => 55004cbd30d6d48819000005
    )

[decade] => 1990
[artist] => Mariah Carey
[song] => One Sweet Day
[weeksAtOne] => Array
    (
        [10] => 16
        [21] => 100
        [23] => 500
    )

)

预期输出:

Array
(
[_id] => MongoId Object
    (
        [$id] => 55004cbd30d6d48819000004
    )

[decade] => 1980
[artist] => Olivia Newton-John
[song] => Physical
[weeksAtOne] => Array
    (
        [10] => 10
        [11] => 100
        [22] => 500
        [156] => 1586
    )

 )
Array
(
[_id] => MongoId Object
    (
        [$id] => 55004cbd30d6d48819000005
    )

[decade] => 1990
[artist] => Mariah Carey
[song] => One Sweet Day
[weeksAtOne] => Array
    (
        [10] => 16
        [21] => 100
        [23] => 500
        [156] => 1586
    )

)

【问题讨论】:

我很难理解您的问题...您能否尝试准确地概括您想要实现的目标以及出了什么问题 @jtmarmom - 我想将关联的数组值推送到子文档“weeksAtOne”数组中。因此,我尝试像上面那样进行更新,但它并没有按预期进行,而是在 weekAtOne 数组中再创建一个数组。 【参考方案1】:

“weeksAtOne”的结构不是真正的数组,而是通常称为“关联数组”或“散列”或“映射”的结构。 PHP 模糊了这方面的界限,但大多数语言在两者之间有明显的区别。

简而言之,您的文档在 JSON 表示法中如下所示:


    "weeksAtOne": 
        "10": 16,
        "21": 100,
        "23": 500
    

$push 运算符适用于真正的数组,或类似如下的东西:


    "weeksAtOne": [
         "10": 16 ,
         "21": 100 ,
         "23": 500 
    ]

您想要的是 $set 运算符并使用 MongoDB 的 "dot notion" 来指定该子文档的内部“关键”元素:

$query = array('decade' => array('$in' => array(1980,1990)));   
$songs->update($query, 
    array('$set'=>array('weeksAtOne.156'=> 1586)),
    array('safe'=>true,'timeout'=>5000,'multiple'=>true))

这将在每个匹配文档的子文档中创建一个新键并设置请求的值。

【讨论】:

以上是关于如何使用php更新mongodb中具有键和值的子文档的主要内容,如果未能解决你的问题,请参考以下文章

Apache Drill 与 mongodb。在地图中查询具有特定键和值的文档

如何使用 Swifty 动态创建具有多个键和值的 json 对象

使用 Swift 将具有相同类型的字典分组到具有完整键和值的数组中

具有特定键和值的通用类型

vbscript 具有键和值的组合框

显示 % forloop% 的键和值的 Django 模板:如何遍历模板中的字典?