Привет, я новичок в 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
)
)
Ваша структура для WeekAtOne — это не истинный массив, а то, что часто называют «связанным массивом», «хэшем» или «картой». 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))
Это создаст новый ключ во вложенном документе каждого соответствующего документа и установит запрошенное значение.
Других решений пока нет …