【问题标题】:MongoDb capped sub-collectionMongoDb 封顶子集合
【发布时间】:2011-07-01 16:00:46
【问题描述】:

是否可以创建一个有上限的子集合。我正在尝试做类似的事情:

user = {
  name: String,
  latest_messages: [String]
}

latest_messages 的上限为 10。

如果没有,您有什么替代方案建议?

更新 1:

似乎手动保持数组上限是唯一的解决方案。这是一种方法:

joe = {name: 'Joe', latest_messages: ['', '', '', '', '', '', '', '', '', '']}
db.users.save(joe)

db.users.update({name: 'Joe'}, {$push: {'latest_messages': 'hello'}})
db.users.update({name: 'Joe'}, {$pop: {'latest_messages': -1}})

db.users.update({name: 'Joe'}, {$push: {'latest_messages': 'world'}})
db.users.update({name: 'Joe'}, {$pop: {'latest_messages': -1}})

对提高效率有何建议?

更新 2:

有一个open Jira ticket, "SERVER-1050" 请求添加执行这两个(推送和弹出)作为一个原子操作的能力。

【问题讨论】:

  • 查看@asya-kamsky 的回答

标签: mongodb


【解决方案1】:

从 2.4 版开始,有一个功能允许这样做,称为“封顶数组”。这允许您将$push 文档与$each$slice$sort 运算符一起添加到数组中,同时保持给定大小,按子文档的指定字段排序。

查看确切的语法和示例here

【讨论】:

    【解决方案2】:

    您只能指定上限集合的文档总数。 除非通过您的应用程序中的一些检查,否则无法限制数组的大小。

    【讨论】:

    • 你有什么方法可以让它比我上面的方法更有效率吗?
    【解决方案3】:

    也许您可以为每个用户创建一个单独的上限集合?所以集合的名字就是每个用户的名字。我不知道如果你有很多集合,MongoDB 会不会变慢?你有多少不同的用户?像 100、1000、10000...?

    【讨论】:

    【解决方案4】:

    在他们的 JIRA 董事会上提出了一个要求,该董事会已经成立了将近 2 年。它已计划从 1.6 开始添加到 mongodb 的下一个版本中,所以我不会屏住呼吸。

    https://jira.mongodb.org/browse/SERVER-991

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-17
      • 1970-01-01
      • 2012-03-26
      相关资源
      最近更新 更多