2013-06-28 5 views
-2

Я создал индекс группы для коллекции методом sureIndex.Mongodb on duplicate key update

Я с использованием метода обновления для вставки данных, но у меня есть проблема вставки больших объемов данных,

Я не понимаю этого «толчок» или «addToSet», используя в «каждый» ключ.

Мне нужен запрос для синтаксиса массивов php.

db.collection.update(
    <query> (here, how I use the query on bulk insert ?), 
    { 
    $addToSet: { 
     <field1>: { $each: [ <value1>, <value2> ... ] }, 
     <field2>: { $each: [ <value1>, <value2> ... ] }, 
     <field2>: { $each: [ <value1>, <value2> ... ] } 
    }, 
    {$inc : {file_hit : 1}} 
    }, 
    {upsert : true, multi : true} 
) 

ответ

1

В $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() объясняет обе опции более подробно.

+0

Благодарим за ответ. Я использую ваш код, когда я иду в свой офис. – FGDeveloper