使用Waterline ORM,MongoDB和Async.parallel更新数据库记录



我是nodejs开发人员。我正在使用带有水线ORM和异步库的Mongodb来执行更新任务。以下是我正在遵循的步骤

function update(task, payload, next) {
    const self = this; 
    async.auto({
        createUpdateObj : (callback) => {
            let update = { status : payload.status };
            return callback(null, update);
        },
        updateTask : ['createUpdate', (result, callback) => {
            self.waterline.collections.task.update(task.id, result.creatUpdateObj, callback);
        }]
    }, (err, results) => {
        if(err) return next(err);
        return next(null, { message : "Task updated successfully." });
    });
}
let dbTasks = [ { id : 1, name : 'Testing', status : 'To Do' }, { id : 2, name : 'Development', status : 'In Progress' } ]
let asyncTasks = [];
let payload = {
    tasks = [{ id : 1, status : 'Done'}, {id : 2, status : 'Testing'}]
};
dbTasks.forEach((task, index) => {
    asyncTasks.push(function(cb) {
        update.bind(hapiServerObject)(task, payload.tasks[index], cb)
    });
});
async.parallel(asyncTasks, console.log); // It prints the response message 2 times.

以上是代码。代码按预期工作,但我面临的唯一问题是,数据库中的每个任务状态都更新为"测试"。这意味着,上次数据库更新查询将更新所有其他状态。

更新查询后,预期结果应为

[ { id : 1, name : 'Testing', status : 'Done' }, { id : 2, name : 'Development', status : 'Testing' } ]

实际结果为

[ { id : 1, name : 'Testing', status : 'Testing' }, { id : 2, name : 'Development', status : 'Testing' } ]

我没有找到我出错的地方。我知道它与对象的引用有关,但我找不到引用在哪里更改。在执行查询之前,对象形成是可以的。

使用的工具:-Hapijs,水线 -> 0.11,异步模块和 MongoDB。

好的,

我找到了答案。代码工作正常。问题是,在更新任务之前,我使用本机水线查询,通过该查询,我从mongodb获得"_id"记录。水线不理解从本机查询结果中接收的"_id"的值。所以水线更新查询变成了从

waterline.collections.collection.update({ id : _id }, { status : "Testing" }).exec()

waterline.collections.collection.update({}, { status : "Testing" }).exec()

因此,所有记录都会更新为上次数据库查询的状态。

最新更新