我们希望构建一个Node.js API,在MongoDB集合中存储无架构文档。每个文件都应该有一个密钥" no"它按顺序命令它们:
[
{ "no": 1, ... },
{ "no": 2, ... },
{ "no": 3, ... },
{ "no": 4, ... },
...
]
我们有以下限制:
no
必须是唯一的(不允许:1 - > 1 - > 2 - > 3)我们的出发点是拥有一个API,在每个存储请求中返回下一个序列号。
POST /collection { "no": 1, ...}
returns {"next": 2}
这会有用吗?
在客户端,它可能类似于这个伪代码:
let next
module.exports.create = (document, cb) => {
if (!next) next = 1 // here it is probably better to sync the initial no with the db instead always starting with 1
document.no = next
return post('/collection', document, (err, res) => {
if (err) ...
next = res.next
return cb(...)
}
}
如果许多并发呼叫者调用了客户端create
,是否会出现两个或多个创建请求重复no
的情况?
答案 0 :(得分:0)
如果您有并发API调用并且客户端有权确定顺序,那么如果客户拥有确定权限的全部权限,那么您几乎不可能实现您的尝试。序列
但是,如果序列没有之间没有任何差距且必须是顺序的,为什么客户端必须是提供序列no 的客户端?您可以轻松地同意排序模式(例如1,2,3,4或AB1,AB2,AB3等),并让服务器端插入序列号,具体取决于哪个请求来在第一。使用findAndModify
创建一个生成运行编号的集合,然后让服务器将序列no更新到数据库中。