【问题标题】:Add (N) to duplicated file name in MongoDB将 (N) 添加到 MongoDB 中的重复文件名
【发布时间】: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-notesample.txt.gz 是唯一的,不应作为 sample.txt 的重复文件名
  • 不带扩展名的文件名也可以正常工作(samplesample(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


【解决方案1】:

使用 KISS 模型,不要让它变得复杂...运行一个计数器,每次添加都会递增。只需将其附加到每个文件即可。如果您不关心添加的数字,那么只要添加一个数字(或任何可以唯一的标记......“xxx12345xxx”作为示例标记),每个文件都可以是唯一的

并活到另一天编码。 :)

【讨论】:

  • 但是如果有人决定添加,比如说,3 sample.txt。现在我们有了 sample.txt、sample(1).txt 和 sample(2).txt。然后我将 yolo 的 sample(1).txt 更改为 sample(3).txt 并再次添加一个新的“sample.txt”。会因为 sample(3).txt 已经存在而发生冲突吗?非常感谢你的回复! :)
  • 我建议,如果可以的话,做一个独特的标记,你的文件名不会有。类似“XXX”与“数字计数器变量”连接,与“XXX”连接。结果是“xxx12345xxx”。如果您确定文件名,您可以将此标记附加到所有文件,并且您将拥有唯一的文件名。您可以添加错误检查以测试是否已经存在此新创建的文件名的文件名,以确保。如果是,则增加并重新检查!
  • 因此,sample(1).txt 变为 sample(1)_xxx12345xxx.txt,sample(2).txt 变为 sample(2)_xxx12346xxx.txt,以此类推。
【解决方案2】:

这里是原作者 - 目前我为重复文件解决了另一种方法:

改为调用

sample.txt
sample(1).txt
sample(2).txt

我决定这样做:

sample.txt
sample.txt (duplicated-6rdcfXNdY2FZpuF)
sample.txt (duplicated-Qkc8eEeBV4Scr87)

这样对我来说效率更高,也足够好。替代方法是使用随机 id + 日期来识别哪个重复的文件名较新。

我不会将此标记为“正确答案”,因为它还不能真正解决问题。

【讨论】:

  • 我可以理解这解决了你的问题,但你为什么称(1)和(2)是“重复的”?如果您在文件系统上检查此行为,编号仍然确保系统具有唯一的文件名。所以对我来说——就像在第二个答案中发布的类似内容一样——只需使用名称作为名称,使用 documentId 作为唯一值。为确保内容是重复内容,您可以添加校验和 (SHA) 之类的内容来识别文档的新旧内容。
  • @TomFreudenberg - 是的,您实际上是对的,“重复”在这里的措辞毫无意义。 Duplicated 用于文件名,而不是文件内容本身。问题在于,如果您想在实际操作系统(Linux、Windows、macOS)上同步文件,它将无法正常工作,因为这些操作系统不允许您在同一文件夹中使用相同的文件名。这也是 Google Drive 中的一个已知问题(一个 Drive 不允许您使用相同的文件名)。因此文件名在同一个文件夹中应该是唯一的。
猜你喜欢
  • 2016-02-27
  • 1970-01-01
  • 1970-01-01
  • 2011-07-28
  • 2016-07-05
  • 2011-01-22
  • 1970-01-01
  • 2018-08-30
  • 2023-03-27
相关资源
最近更新 更多