2016-10-15 52 views
0

我正在研究將在MongoDB中的shell中運行的腳本。我只使用純Javascript而不是node.js或Meteor。我有一個數組,其中分別包含字段名稱和字段值的鍵和值對。我試圖使用數組中的鍵值作爲更新函數中的字段名稱。

var USER_ID = 1234567 
var myArray = [ 
    { key : "name.first.nickname", value : "Sammy" } 
] 

for(var i = 0; i < myArray.length; i++){ 
    setFields(myArray[i].key, myArray[i].value) 
} 

function setFields(key, value){ 
    db.nameCollection.update(
    {user : USER_ID}, 
    { 
    $set: { 
     key : value 
     } 
    } 
    ) 
} 

字段名總是被設置爲「鑰匙」,而不是關鍵變量的值「name.first.nickname」。有沒有辦法做到這一點?

回答

1
function setFields(key, value){ 

    var update = {$set:{}};  
    update.$set[key] = value; 

    db.Test.update(
    {userId : userId}, 
    update 
    ); 
} 

var userId = "daniele"; 

var myArray = [ 
    { key : "dynamic_key_002", value : "Sammy" } 
] 

for(var i = 0; i < myArray.length; i++){ 
    setFields(myArray[i].key, myArray[i].value) 
} 

而且 - 如果你需要做大量的更新,也許你可以考慮批量他們,而不是使查詢一個接一個。

MongoDB提供客戶端批量執行寫操作的能力。批量寫入操作會影響單個集合。 MongoDB允許應用程序確定批量寫入操作所需的可接受確認級別。

https://docs.mongodb.com/manual/core/bulk-write-operations/

+0

它的工作!非常感謝你回答這個問題。我試着讓一個對象具有所有這些鍵/值對,然後將該對象傳遞給使用$ set進行更新的函數,所以我只需要$ set一次來執行更新。關鍵總是像objectName.name.first.nickname:「Sammy」。你會如何去添加對象中的所有鍵/值,然後用沒有對象名稱的對象中的鍵/值來執行$ set? – jdub7

+0

我最終發現瞭如何使用對象執行setFields函數,而不是逐字段執行。它這樣做是通過: – jdub7

+0

函數setFields(對象){ \t變種更新= {$集合:{}} \t爲(在對象VAR鍵){ \t \t VAR值=對象[鍵] \t \t更新$。設置[key] =值 \t} – jdub7