Parse JS SDK提供了一种Parse.Object.saveAll()
方法,用一个命令即可保存许多对象。
[从ParseServerRESTController.js
看,似乎每个对象都是单独保存的:
ParseServerRESTController.js
if (path === '/batch') {
let initialPromise = Promise.resolve();
if (data.transaction === true) {
initialPromise = config.database.createTransactionalSession();
}
return initialPromise.then(() => {
const promises = data.requests.map(request => {
return handleRequest(
request.method,
request.path,
request.body,
options,
config
).then(
response => {
return {
success: response
};
},
error => {
return {
error: {
code: error.code,
error: error.message
},
};
}
);
});
return Promise.all(promises).then(result => {
if (data.transaction === true) {
if (
result.find(resultItem => typeof resultItem.error === 'object')
) {
return config.database.abortTransactionalSession().then(() => {
return Promise.reject(result);
});
} else {
return config.database.commitTransactionalSession().then(() => {
return result;
});
}
} else {
return result;
}
});
});
}
似乎只是方便地保存每个对象的便利包装,因此它似乎仍然对saveAll
个对象提出了n
数据库请求。
它正确地认为n
不具有成本优势(性能,网络流量等),而不是分别保存每个对象使用云代码?
我可以告诉你答案是saveAll
对象中的Parse.Object.saveAll
和Parse.Object.destroyAll
批处理请求。但是为什么要相信我呢?让我们对其进行测试!
打开详细登录,然后运行以下命令:
default
这是解析服务器日志的输出(我已将其截断,但应该足以表明正在发生的事情:]]
20在核心管理器代码中,您正确地标识出我们正在向数据存储区(即MongoDB)请求每个对象,这是必要的,因为对象可能具有必须处理的关系或指针,并且可能需要对数据存储的其他调用。
但是!解析服务器和数据存储之间的调用通常是使用二进制格式通过非常快的网络进行的,而客户端和解析服务器之间的调用则为JSON,并且通常使用较慢的连接来进行更长的传输。
您可以在核心管理器代码中看到另一个潜在的优势,即批处理是在事务中完成的。