2016-08-22 56 views
3

我正在使用jquery ui的可排序函數(source)重新排列元素。我已經構建了自定義回調來創建這些元素的列表。所以當我移動一個元素時,所有元素都被賦予一個新的位置ID。它看起來是這樣的:用不同的值更新多個文檔

[{ 
    id_of_element_in_database: 12, 
    new_position: 0 
}, { 
    id_of_element_in_database: 16, 
    new_position: 1 
}, { 
    id_of_element_in_database: 14, 
    new_position: 2 
}] 

我做發送此列表給我的後端簡單阿賈克斯後

$.post('/position', { data: list }); 

路線

router.post('/position', (req, res) => { 
    console.log(req.body.data); // This prints the array of objects above. 
}); 

Schema

mongoose.Schema({ 
    id: Number, 
    position: Number, 
    ... 
}); 

現在我無法弄清楚如何有效地改變所有文件的位置。創建一個糟糕的數組循環並執行多個數據庫請求不是最好的方法。

我試過在這裏,這感覺是錯誤的。

for (let i in req.body.data) { 
    collection.update({ id: req.body.data[i].id }, { position: req.body.data[i].position }); 

我必須做點什麼才能做到這一點。我試過谷歌沒有任何運氣。

回答

2

你可以嘗試bulkWrite API開展以更好的方式更新,而不需要多次請求到服務器:

var callback = function(err, r){ 
    console.log(r.matchedCount); 
    console.log(r.modifiedCount); 
} 
// Initialise the bulk operations array 
var ops = req.body.data.map(function (item) { 
    return { 
     "updateOne": { 
      "filter": { 
       "id": parseInt(item.id), 
       "position": { "$ne": parseInt(item.position) } 
      },    
      "update": { "$set": { "position": parseInt(item.position) } } 
     }   
    }  
}); 

// Get the underlying collection via the native node.js driver collection object 
Model.collection.bulkWrite(ops, callback); 
+0

謝謝!我會嘗試這個並回復你! –

+1

通過這個小小的調整'parseInt(item.id)','parseInt(item.position)'並從集合中刪除了'unique'索引,這個解決方案完美無缺地工作。謝謝! –

+0

@JonathanNielsen不用擔心,很樂意幫忙。 – chridam

0

這是我如何與Node.js的做到了:

var forEach = require('async-foreach').forEach; 
var bulk = Things.collection.initializeOrderedBulkOp(); 


    Things.find({}).lean().execAsync(execSettings).then(function(resp){ 

    forEach(resp, function(template, index, arr) { 

     var done = this.async(); 

     bulk.find({'_id': template._id}).update({$set: {_sid: generateShortId()}}); 
     bulk.execute(function (error) { 
      done();     
     }); 

    }, function(notAborted, arr){ 

     res.json({done: true, arr: arr.length}); 

    }); 

    });