【发布时间】:2021-08-31 23:38:36
【问题描述】:
我想知道是否有一种算法方法可以在重复的文件名中添加数字。例如,我在 file 集合中有以下示例简单文档:
[
{
"_id": "612ead8668bfcc4221a788f6"
"name": "sample.txt",
},
{
"_id": "612ead8668bfcc4221a788f7"
"name": "sample(2).txt",
},
{
"_id": "612ead8668bfcc4221a788f8"
"name": "sample(4).txt",
},
{
"_id": "612ead8668bfcc4221a788f9"
"name": "sample(5).txt",
},
{
"_id": "612ead8668bfcc4221a788fa"
"name": "other-sample.txt",
},
{
"_id": "612ead8668bfcc4221a788fb"
"name": "sample",
},
{
"_id": "612ead8668bfcc4221a788fc"
"name": "sample.txt.gz",
}
]
现在我想添加一个名为:
{"name": "sample.txt"}
是否有一种算法可以自动将其更改为sample(3).txt(因为集合中没有sample(3).txt)或sample(6).txt(跳过所有以前的数字)?
我最初的想法是将.count() 与检查“sample(N).txt”的过滤器一起使用(每个正则表达式)。但这并不准确,因为作为文档示例,“sample(N).txt”存在 4 次。调用“sample(4).txt”是不正确的,因为它已经存在。
也许正则表达式有一种方法可以找到最高的文件名计数并从这里提取它?如果需要,文档可以具有其他字段名称。 (或者也许在这里添加一个duplicated 数字字段可能很有用,然后在.aggregate() 中使用$max,您可以获得最高重复文件名?这样有效吗?)
补充说明:
-
sample.txt-note或sample.txt.gz是唯一的,不应作为sample.txt的重复文件名 - 不带扩展名的文件名也可以正常工作(
sample、sample(1)、sample(2)等) - 尽可能快的算法/最少的写入或/和读取调用。对每个重复的文件名使用 for-loop 太慢/太昂贵(计划使用 MongoDB Atlas Serverless)
我正在使用:
- nodejs (TypeScript/JavaScript) 与本机 mongodb 驱动程序(不是 mongoose)
- MongoDB 5.0
如果有人有想法,那就太棒了!谢谢!
附:如果我碰巧有一个解决方案,那么我当然也会在这里发布给未来的访问者! :)
P.S.(2) 如果示例使用不同的编程语言,我完全没问题!
【问题讨论】:
-
也许拥有第二个集合来拥有该计数器会更容易,例如
{"filename" : "sample" "availiable" : [3 6]}表示这些是未采用的数字。并且每次需要号码时,都可以通过 FindAndModify 根据名称获取免费号码。 -
您可以运行
find()操作并获取所有名为sample(n)的文件吗? -
@Takis_ 这是一个非常有趣的想法,可能非常有效!我会看看我能在这里玩什么!
-
@programmerRaj 唯一的缺点是如果你碰巧有大量的文档/文件称为这个样本(n)——那会很慢吗?但我也很好。欢迎任何想法+我很感激:)
-
如果您使用文件的哈希值来唯一标识而不是保持文件名唯一怎么办?这并不是真正回答问题,而是另一种选择。
标签: javascript node.js mongodb file filenames