В $push
и $addToSet
операторы обновления оба добавления значения в поле массива. $push
аналогичен выполнению $arr[] = $value
в PHP, поскольку значение всегда добавляется. $addToSet
добавит значение к массиву только в том случае, если оно еще не существует, обработав таким образом массив как set.
Как правило, оба $push
и $addToSet
ожидают одно значение для поля. Если вы хотите указать несколько значений, вы можете обернуть их оператором $each
, который вы делали выше в примере кода. До MongoDB 2.4 вы могли использовать оператор $pushAll
, но с тех пор он устарел в пользу $each
. Связанная документация для каждого из этих операторов должна четко объяснять, как они функционируют друг относительно друга.
Если перевести исходный пример JS в PHP, используя MongoCollection::update():
$collection->update(
[], /* update query */
[
'$addToSet' => [
[ 'field1' => [ '$each' => [ $value1, $value2 ]],
[ 'field2' => [ '$each' => [ $value3, $value4 ]],
],
'$inc' => [ 'file_hit' => 1 ],
],
[ 'multi' => true ]
);
Примечание: Я использую короткий синтаксис массива PHP 5.4 в выше. Более ранние версии должны будут использовать array()
вместо []
.
Я исправил несколько ошибок, которые были в вашем примере JS. Во-первых, я удалил объект вокруг $inc
, так как операторы обновления находятся на верхнем уровне второго параметра. $inc
должен сидеть параллельно $addToSet
.
Я также удалил опцию upsert
, так как это несовместимо с multi
. Логически upsert
решает обновить документ, если он существует, или вставить его иначе. Это принципиально несовместимо с обновлением нескольких документов. Документация MongoDB db.collection.update() объясняет обе опции более подробно.
Благодарим за ответ. Я использую ваш код, когда я иду в свой офис. – FGDeveloper