2013-06-28 165 views
-2

我創建了通過ensureIndex方法收集的組索引。Mongodb重複密鑰更新

我使用更新方法來進行插入,但我有問題的批量數據插入,

我不明白這個「推」或「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與PHP中的$arr[] = $value類似,因爲該值始終附加。如果數組不存在,$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