使用不同的值更新多个文档

时间:2016-08-22 14:40:43

标签: javascript node.js mongodb mongoose

我正在使用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
}]

我通过做一个简单的 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 个答案:

答案 0 :(得分:3)

您可以尝试 bulkWrite API以更好的方式执行更新,而无需向服务器发出多个请求:

.page
    position relative


    &__content
        scroll()
        overflow auto


    &--home // working
        .page__content
            margin 30px


    &--home // not working
        & ~/__content
            margin 30px

答案 1 :(得分: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});

    });

  });