【问题标题】:Incremental field to existing collection现有集合的增量字段
【发布时间】:2015-11-01 00:53:25
【问题描述】:

我有一个包含大约 100k 文档的集合。我想在我的文档中添加一个自动递增的“custom_id”字段,并从现在开始通过递增该字段来继续添加我的文档。

最好的方法是什么?我在官方文档 (http://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/) 中看到了一些示例,但它们仅用于添加新文档,而不用于更新现有集合。

我根据上面的链接创建的示例代码来增加我的计数器:

function incrementAndGetNext(counter, callback) {
    counters.findAndModify({
        name: counter
    }, [["_id", 1]], {
        $inc: {
            "count": 1
        }
    }, {
        "new": true
    }, function (err, doc) {
        if (err) return console.log(err);
        callback(doc.value);
    })
}

上面的代码countersdb.counters 集合,我有这个文档:

{_id:"...",name:"post",count:"0"}

很想知道。

谢谢。

附:我正在为 js 使用本机 mongojs 驱动程序

【问题讨论】:

  • 我也刚刚在两个问题前给了这个链接:Create an Auto-Incrementing Sequence Field
  • @BlakesSeven 那个链接就是我上面提到的那个,频繁添加文档的时候就失效了。
  • @Zettam :你为什么需要一个“增量字段”?你的问题不够清楚,你已经看过“一些例子”,我们不是来猜测这些例子是什么,我们不是来猜测我们一无所知的例子中是否存在弱点,我们是不是在这里猜测你是否错误地认为一个例子不好,然后猜测要解释什么。如果您需要帮助,请重写您的问题。 (我脑子里有一些想法,但如果我不确定你的问题是什么,我就不会写了……)
  • 我正在尝试的代码已链接。我提到了这个问题,当添加太多文档时,它会中断。你可以试试。

标签: mongodb


【解决方案1】:

好吧,using the link you mentionned,我宁愿使用counters collection approach

计数器集合方法有一些缺点,包括:

  • 它总是生成多个请求(两个):一个获取序列号,另一个使用您通过序列获得的 id 进行插入,
  • 如果您使用的是 mongodb 的分片功能,一个负责存储计数器状态的文档可能会被大量使用,并且每次都会到达同一个服务器。

但它应该适合大多数用途。

你提到的方法 ("the optimistic loop") 不应该破坏 IMO,我猜你为什么会有问题。但是我不推荐它。如果您在多个 mongo 客户端上执行代码,如果一个有很多延迟而其他人继续使用 ID,会发生什么?我不希望遇到这种问题...此外,每次成功操作至少有两个请求,但成功前没有最大重试次数...

【讨论】:

  • 感谢您的洞察力。但是,我无法使用相同的循环来遍历所有现有文档以向它们添加增量字段。任何想法,将不胜感激。对于一个新系列来说,它工作得很好。
猜你喜欢
  • 2021-07-17
  • 2018-07-15
  • 2014-01-27
  • 2019-04-08
  • 1970-01-01
  • 2010-10-06
  • 1970-01-01
  • 2022-12-13
  • 2019-07-21
相关资源
最近更新 更多