2017-04-21 46 views
1

我想要做一些像我们的计算机的文件系统,其中如果文件名称“测试”出现在一个文件夹中,我们尝试创建一个具有相同名称的文件,那么我们得到的结果为“test(01)”,如果我们再试 那么我们得到结果“test(02)”。像文件系统重复的名称功能

基本上,我想在我的项目中使用这种功能。我使用的猫鼬,每当用户加入数据库中,我要检查,如果相同的名称已经存在,那么我们追加在其名称中的数名

的NodeJS
// schema 
var schema = new Schema({ 
    name: { 
     type: String, 
     required: true 
    } 
}, options); 

像第一次用户加入名=测试,然后在分贝,我们将保存为名称=测试

其次时添加名称=测试,然后在分贝,我们将保存的名称作为名称=测试(01)

第三次添加name = test,然后在db中我们将名称保存为name = test(02)

等等。

任何人都可以提供帮助。谢谢 !

+2

这是不平凡的实施。你试图解决什么问题? – robertklep

+0

你可以证明你到目前为止所做的尝试,并描述它在多大程度上成功或失败? –

+0

@robertklep:以上是我在项目中遇到的问题的一个示例。我已经解释了模式下的确切问题。 – Sam

回答

0

您可以添加另一个字段作为版本,当文件来检查是否有任何较早的文件存在相同的名称或如果结果为false/null,然后保存为文档否则推送作为该文件的版本。

0

这是一个粗略的想法。

我会使用正则表达式来查找所有具有相似名称的用户,按降序对它们进行排序,以第一个结果来知道谁是最高后缀用户(digit) - 以找出下一个数字。我们的regular expression将为(digit)部分提供一个可选capturing group

这将是这样的(记住裸这是未经测试):

// 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 
    }) 
}) 

Small illustration

+1

从理论上讲,这是一个很好的解决方案,实际上它(并且说实话,每个合理简单的实现)都受到大并发的问题。 – robertklep

+0

你说得对。这是一个比看起来更大的问题。 – Mikey