使用Mongodb上的水线模型更新多个记录

时间:2017-04-28 18:25:08

标签: node.js mongodb sails.js waterline

给定的是一个包含书籍对象的数组,其中每个status都必须更新:

var books = [ 
              { id: '58b2e58', status: 'pending' },
              { id: '5903703', status: 'pending' } 
                ]

var status = {status: 'accepted'}

我尝试了this

Book.update(books, status).exec(function afterwards(err, updatedbooks) {
            if (err) {
                res.json(err)
                }
            console.log("updatedbooks:", updatedbooks);
});

但是已经更新过的书'日志是空的。登记mongodb时,书籍就在那里,我可以用Book.find(books);

找到它们

作为here mentioned,这里的工作正常,但我希望在ID旁边还有状态=="待定"在WHERE标准中。

2 个答案:

答案 0 :(得分:1)

请试试这个。

var bookId= ['1','3'];
var status = {status: 'accepted'}
Book.update({id:bookId, status: 'pending'}, status).exec(function afterwards(err, updatedbooks) {
        if (err) {
            console.log('error in update\n'+err);
            res.json(err)
            }
        else{
            console.log("updatedbooks:", updatedbooks);
        }
});

这应该有效。此外,如果您收到错误,它会让您知道您得到的错误。

答案 1 :(得分:0)

如果有人有正确的答案,请不要等待。我找到了一个解决方法:

find()功能可以采用以下标准:

var bookCriteria = [ 
              { id: '1', status: 'pending' },
              { id: '3', status: 'pending' } 
                ]

update()函数仅适用于带有ids的数组:

var bookCriteria = [ '1','3']

因此,我们首先搜索符合我们标准的书籍,然后拿走这些书籍并更新它们。

      Book.find(bookCriteria).exec(function (err, booksFounded) {
            //booksFounded is an array with book objects, with status = 'pending'
            //but we need an array with booksFounded ids as strings

              var bookIDs = booksFounded.map( book => book.id}); //['1','3']

            //now update:

                Book.update(bookIDs , {status:'accepted'}).exec(function afterwards(err, updatedbooks) {
                if (err) {
                    res.json(err)
                    }
                console.log("updatedbooks:", updatedbooks);
                });

   })

你有更好的解决方案吗?使用我的解决方案,它需要2个数据库事务,但它可以工作。