您好我是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
)
)
答案 0 :(得分:0)
你的结构" weekAtOne"不是真正的数组,而是通常被称为"关联的数组"或"哈希"或" map"。 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))
这将在每个匹配文档的子文档中创建一个新密钥,并设置所请求的值。