2016-08-22 6 views
3

Я использую функцию сортировки jquery ui (source), чтобы переупорядочить элементы. Я создал пользовательские обратные вызовы для создания списка этих элементов. Поэтому, когда я перемещаю элемент, всем элементам присваивается новый идентификатор позиции. Это может выглядеть следующим образом:Обновление нескольких документов с различными значениями

[{ 
    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 
}] 

Я посылаю этот список мой задний конец, делая простой Ajax размещать

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

Маршрут

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

Схема

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 }); 

Должно быть что-то еще, что я могу сделать для достижения этого. Я пробовал Google без везения.

ответ

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

С помощью этого небольшого tweak '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}); 

    }); 

    });