как обновить вложенный документ, имеющий ключ и значение в mongodb, используя переполнение стека

Привет, я новичок в 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

Решение

Ваша структура для 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))

Это создаст новый ключ во вложенном документе каждого соответствующего документа и установит запрошенное значение.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]