2017-03-19 73 views
1

首先,我已閱讀this stack overflow entry,它部分解決了此問題,但我需要動態添加多個條目,並且無法將答案應用於此問題。使用多個值部分更新嵌套對象Express.js MongoDB

我有一個網站有民意調查(使用express和mongodb驅動程序),我希望用戶在提交後能夠向民意調查添加其他選項(他們只能添加其他項目,他們不能編輯先前存在的項目)。

所有選項(可能的答案)被標記爲answer後跟一個數字(最多5個)。

所以在數據庫中,我們有:那麼,這一行

{ 
    "_id": { 
     "$oid": "58cdf0023cefa56136afb50f" 
    }, 
    "question": "Who is the best Bob?", 
    "options": { 
     "answer1": { 
      "option": "Bob Dylan", 
      "votes": 2 
     }, 
     "answer2": { 
      "option": "Bob Geldof", 
      "votes": 0 
     } 
    } 
} 

,用戶最多可以添加三個額外的答案選項。

當我硬編碼額外的答案名稱(例如在這個數據庫示例answer3)我可以更新嵌套的options屬性。

var toInsert = { options: 
    { answer3: { option: 'Bob Saget', votes: 0 }, 
    answer4: { option: 'Bob Marley', votes: 0 } } } 

    db.collection('questions') 
    .findOneAndUpdate({"_id": questionId}, {$set : {'options.answer3': [toInsert.answer3]}}, {upsert: true}, (err, result) => { 
    if (err) return res.send(err) 
    res.send("worked"); 
    }) 

編輯︰我剛剛意識到他有一個錯誤,所以我甚至不能硬編碼正確的答案。但是,爲了清晰起見,我將在此留出。

但我需要做的是動態更新嵌套的options對象,其中包含1-3個可能的新選項(取決於用戶想要的內容),並將預先存在的數據保留在options對象中。在上面的示例代碼中,我想從toInsert插入answer3answer4

我對Node和MongoDB非常陌生,我的想法是「嘿,我可以通過一個for loop」,即使我能夠實現它,它似乎也是一個糟糕的主意。

回答

1

通過用選項嵌入的數組文件替換答案文檔,可以實現您的目標。

{ 
    "_id": { 
     "$oid": "58cdf0023cefa56136afb50f" 
    }, 
    "question": "Who is the best Bob?", 
    "options": [ 
     { 
      "answer" : "answer1", 
      "option": "Bob Dylan", 
      "votes": 2 
     }, 
     { 
      "answer" : "answer2", 
      "option": "Bob Geldof", 
      "votes": 0 
     } 
    ] 
} 

現在,您可以通過使用$each$push運營商輕鬆地添加嵌入文件的選項。

db.collection('questions') 
    .findOneAndUpdate({"_id": questionId}, {$push: { options: { $each: [ { answer: "answer3", option: 'Bob Saget', votes: 0 },{ answer: "answer4", option: 'Bob Marley', votes: 0 } ] } } }) 
1

不知道這是要做到這一點的最佳方式,但你可以做的是第一次運行findOne查詢找到您要修改,然後使用Object.assign()上返回的文檔從其他對象添加選項,然後替換文件該文件更新了使用replaceOne的文件。

col.findOne(
    {_id: mongodb.ObjectId('IdOfObject')}, 
    function(err, doc) { 
    if (err) console.log(err); 
    Object.assign(doc.options, toInsert.options) 

    col.replaceOne(
     {_id: mongodb.ObjectId('IdOfObject')}, 
     doc, 
     function(e, d) { 
     if (e) console.log(e) 
     else console.log('Object Updated.') 
     } 
    ) 
    } 
) 

更新的對象將看起來像這樣

{ _id: 58ce98cbd85b01133c4c3615, 
    question: 'Who is the best Bob?', 
    options: 
    { answer1: { option: 'Bob Dylan', votes: 2 }, 
    answer2: { option: 'Bob Geldof', votes: 0 }, 
    answer3: { option: 'Bob Saget', votes: 0 }, 
    answer4: { option: 'Bob Marley', votes: 0 } } }