Node.js 重复名称功能,如文件系统
我试图做一些类似于我们计算机的文件系统的事情,如果文件名“test”出现在一个文件夹中,我们尝试创建一个同名的文件,那么我们得到的结果是“test(01)”,如果我们再试一次 然后我们得到结果“test(02)” 基本上,我希望在我的项目中使用这种功能。我用的是猫鼬和nodejsNode.js 重复名称功能,如文件系统,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我试图做一些类似于我们计算机的文件系统的事情,如果文件名“test”出现在一个文件夹中,我们尝试创建一个同名的文件,那么我们得到的结果是“test(01)”,如果我们再试一次 然后我们得到结果“test(02)” 基本上,我希望在我的项目中使用这种功能。我用的是猫鼬和nodejs // schema var schema = new Schema({ name: { type: String, required: true } }, options
// schema
var schema = new Schema({
name: {
type: String,
required: true
}
}, options);
每当用户在数据库中添加名称时,我必须检查是否已经存在相同的名称,然后将计数附加到其名称中
就像第一次用户添加name=test一样,然后在db中我们将另存为name=test
第二次添加name=test,然后在db中我们将name保存为name=test(01)
第三次添加name=test,然后在db中将name保存为name=test(02)
诸如此类
有人能建议帮忙吗。谢谢 您可以添加另一个字段作为版本,当文件出现时,检查是否存在同名的早期文件如果结果为false/null,则另存为文档,否则将推送为文件版本。您可以添加另一个字段作为版本,当文件出现时,检查是否存在同名或不同名的早期文件如果结果为false/null,则不必保存为文档,否则将推送为文件的版本。这里是一个粗略的想法 我会使用正则表达式来查找所有具有相似名称的用户,对他们进行向下排序,获取第一个结果以知道谁是后缀最高的用户
(digit)
-以便找出下一个数字。我们将为(数字)
部件提供一个可选部件
可能是这样的(请记住,这是未经测试的):
这里有一个大致的想法
我会使用正则表达式来查找所有具有相似名称的用户,对他们进行向下排序,获取第一个结果以知道谁是后缀最高的用户(digit)
-以便找出下一个数字。我们将为(数字)
部件提供一个可选部件
可能是这样的(请记住,这是未经测试的):
实现这一点并不容易。你想解决的确切问题是什么?你能展示你迄今为止所做的尝试,并描述成功或失败的程度吗?@robertklep:以上是我在项目中面临的一个问题的例子。我已经在架构下面解释了确切的问题。@Sam,但这只是问题的一部分,因为这可能的实现方式也取决于您打算如何准确地查询这些用户(通过原始名称还是通过修改名称?),如果用户输入
test(01)
作为用户名,如果这是登录系统的一部分,应该怎么做,等等……这不是一件小事。你想解决的确切问题是什么?你能展示你迄今为止所做的尝试,并描述成功或失败的程度吗?@robertklep:以上是我在项目中面临的一个问题的例子。我已经在架构下面解释了确切的问题。@Sam,但这只是问题的一部分,因为这可能的实现方式也取决于您打算如何准确地查询这些用户(通过原始名称还是通过修改名称?),如果用户输入test(01)
作为用户名,如果这是登录系统的一部分,应该怎么做,等等…理论上这是一个很好的解决方案,实际上它(老实说,每个相当简单的实现)都会遇到很大的并发问题。你说得对。这是一个比看起来更大的问题。理论上这是一个很好的解决方案,实际上它(老实说,每个相当简单的实现)都会遇到严重的并发问题。你是对的。这是一个比看起来更大的问题。
// suppose req.body.name = test
let re = new RegExp(`^${req.body.name}(\((.*)\))?$`, 'i'); // e.g. /^test(\((.*)\))?$/i
schema.find({ name: re }).sort('name', -1).limit(1).exec(function (err, users) {
// there is a user with a similar name already
if (users.length) {
// apply regular expression on the matched user's name again to get info
// about the capturing groups
// note:
// > re.exec('test')
// > [ 'test', undefined, undefined, undefined, index: 0, input: 'test' ]
// > re.exec('test(02)')
// > [ 'test(02)', '(02)', '(02)', '(02)', index: 0, input: 'test(02)' ]
let m = re.exec(users[0].name), digit = 0;
// take out the number
if (m && typeof m[1] !== 'undefined') {
digit = parseInt(m[1].replace(/[^\w]/gi, ''), 10); // e.g. (02) => 2
}
let suffix = '(' + (++digit).toString().padStart(2, '0') + ')'; // e.g. 2 => (03)
req.body.name += suffix;
}
schema.create(req.body, function () {
// etc
})
})