2017-05-29 89 views
1

比方說我的測試數據是更新多條記錄,如果不存在插入

db.multiArr.insert({"ID" : "fruit1","Keys" : "apple"}) 
db.multiArr.insert({"ID" : "fruit2","Keys" : "carrot"}) 
db.multiArr.find({'ID': {$in: ['fruit1', 'fruit2']}}) 

,如果我想更新或使用

db.multiArr.update(
    {'ID': "fruit12"}, 
    { 
     'ID': "fruit12" 
     "$push": { 
      "Keys": "tomato" 
     } 
    }, 
    upsert=True 
) 

我想更新插入一個ID,我可以做到這一點或插入多個記錄,我知道下面的查詢插入只有1行

db.multiArr.update(
    {"ID": {"$in: ["fruit123", "fruit1234"]}}, 
    {"ID": "---", "Keys": "tomato"}, 
    upsert=true 
) 

有沒有辦法更新/插入多個記錄? enter image description here

+0

你問你是否以這個數組開頭'[「fruit123」,「fruit1234」]'那麼如何用''tomato'插入/插入多個文檔'總是作爲'Keys'的值?你意識到你基本上用''ID「:」---「''''來避免'$ in'和upsert出現在第一位的錯誤,這是不是你?我不確定我看到「實用」實用程序。 –

+0

事情是我想更新集合中的現有記錄,如果ID存在或者插入記錄與新的ID,而不是循環每個ID –

+0

所以你的意圖是「創建」與提供的「ID」來自陣列的值。是?注意自「'ID」:「---」',並且整個更新文檔以覆蓋提供的值的方式指定。我們理解upsert部分,這只是你打算採取的其他行動並不清楚。 –

回答

0

你對此的看法是錯誤的。相反,你需要「陣列」並將其轉化爲操作。在「一個請求」中發送多個「請求」,而不是發送多個「請求」。使用.bulkWrite()

var newKeys = ["fruit123", "fruit1234" ]; 

db.multiArr.bulkWrite(
    newkeys.map(key => { 
    return { 
     "updateOne": { 
     "filter": { "ID": key }, 
     "update": { "$set": { "Keys": "tomato" } }, 
     "upsert": true 
     } 
    } 
    }) 
) 

這裏的批量操作,使用常規的JavaScript .map()newKeys數組內容轉換成「批量寫入操作」語句的數組發送到服務器。在其他語言中,基本概念保持不變。

通過網絡,服務器的發送和響應在「一個請求」中完成,而發送用於執行的「包」包含多個動作。

如果需要在所有API中返回此方法是BulkWriteResult,其中包含適當的匹配文檔,更新和upserts的詳細信息。

相關問題