Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 重复名称功能,如文件系统_Node.js_Mongodb_Mongoose - Fatal编程技术网

Node.js 重复名称功能,如文件系统

Node.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

我试图做一些类似于我们计算机的文件系统的事情,如果文件名“test”出现在一个文件夹中,我们尝试创建一个同名的文件,那么我们得到的结果是“test(01)”,如果我们再试一次 然后我们得到结果“test(02)”

基本上,我希望在我的项目中使用这种功能。我用的是猫鼬和nodejs

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