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


how to update sub document having key and value in mongodb using php

嗨,我是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
    )
)

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

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

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

$push运算符适用于真正的数组,或如下所示的内容:

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

你想要的是$set运算符,并使用MongoDB的"点概念"来指定该子文档的内部"键"元素:

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

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