2015-11-12 125 views
0

我有我的包裹的頭周圍採用mongooseJS和ExpressJS在我的MongoDB更新多個值的問題。快遞/貓鼬更新查詢

讓我們說,我提出2個或多個對象的數組從我的前端,以「表達路由」,並有我得到的req.body參數去取。我的req.body看起來像這樣:

[articles: 
    { article: { 
     _id: '564209c66c23d5d20c37bd84', 
     quantity: 25, 
    }, 
    { article: { 
     _id: '564209c66c23d5d20c37bd83', 
     quantity: 51, 
    }, 
}] 

然後我需要循環?要找到數據庫中的特定文章進行更新,並找到該文章時,我想更新前端的「數量」值到數據庫中正確的文章。

var id = []; 
var body = {}; 

for (var i = req.body.length - 1; i >= 0; i--) { 
    id.push(req.body[i].article._id); 
    body[i] = req.body[i].article.quantity; 
}; 

Articles.update( 
    { _id: {$in: id} }, 
    { $set: {quantity: body[0].article.quantity} }, 
    {multi: true}, 
    function(err, response){ 
    if(err) 
     console.log(err); 

    console.log(response); 
}); 

這段代碼的問題是,我把所有文章的第一篇量值,我希望它是從前端正確的。這感覺就像我在正確的道路上,但我對mongoDB很新,並表達如此,如果有更好的解決方案或甚至解決方案讓我知道。

回答

0

Grahlie,

如果您有疑問的問題,它有時是有用的,以測試從MongoDB的查詢殼本身的鍛鍊邏輯。

如果你的文章的文檔結構爲這樣:

{ 
    _id: ObjectId("564209c66c23d5d20c37bd84"), 
    quantity: 25 
} 
{ 
    _id: ObjectId("564209c66c23d5d20c37bd83"), 
    quantity: 51 
} 

如果您想更新的唯一文件的基礎上它的數量是_id,那麼你可以這樣用此查詢。

db.articles.update(
    {"_id": "564209c66c23d5d20c37bd84"}, 
    {$set : { "quantity" : 25}} 
) 

如果你想更新,你可以使用$in相同數量的多個文檔,但是這不是你想要做什麼。您想循環訪問req.body陣列並更新每個article的數量。

所以,你的代碼會是這樣:

var articles = req.body; 


var updateArticle = function(article) { 

    Articles.update(
     {_id:article._id}, 
     {$set:{ quantity: article.quantity}}, 
     function(err, article){ 
      ... 
    ); 

} 


for(var i = 0, n = articles.length; i < n; i++){ 
    updateArticle(articles.[i].article); 
} 
+0

由於這是我一直在尋找!但有這個小問題,我從節點得到這個錯誤: 拋出新的錯誤('無法設置標題發送後');使用 林res.json()函數返回一個響應,我明白,這是問題嗎?有沒有辦法收集所有回覆併發送,或者我應該怎麼做? – grahlie

+0

是的。這是因爲你正在調用res.json()兩次。 – inspired

+0

您可以使用['async'(https://github.com/caolan/async#asyncjs)找出當所有的更新都完成,然後把你的res.json()響應。 – inspired