我是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()
因此,所有记录都会更新为上次数据库查询的状态。