【问题标题】:What is a better way to setup mongo?设置 mongodb 的更好方法是什么?
【发布时间】:2012-04-20 14:50:52
【问题描述】:

我有一组相同的文档,但可以根据使用情况分为两个不同的组。

其中一个组(我们将其称为“当前”组)具有少量文档被大量查询。

另一组,我们将其称为“积压”,是查询频率较低的大量文档。

我的想法是,不混合这两种类型的同一文档将允许我查询非常活跃的“当前”文档,而无需每次都筛选大量“积压”。

这些应该在两个不同的集合中还是在同一个“汽车”集合中?

mongo.collection('cars', function(err, cars){
    cars.find({type:'new', color:'blue'}).toArray(function(err, newBlueCars) {
        //do something with newBlueCars
    });
});

mongo.collection('cars', function(err, cars){
    cars.find({type:'used', color:'blue'}).toArray(function(err, usedBlueCars) {
        //do something with usedBlueCars
    });
});

mongo.collection('cars.current', function(err, cars){
    cars.find({color:'blue'}).toArray(function(err, currentBlueCars) {
        //do something with newBlueCars
    });
});

mongo.collection('cars.backlog', function(err, cars){
    cars.find({color:'blue'}).toArray(function(err, backlogBlueCars) {
        //do something with usedBlueCars
    });
});

【问题讨论】:

  • 你想一起查询它们吗?这是将它们保留在同一个集合中的有力论据。如果不是,那么两个集合可能是有意义的。
  • @WesFreeman 我可以为我所做的罕见事件使用集合名称间距吗?汽车.当前,汽车.积压
  • @fancy:是的,但我相信这将是两个查询而不是一个查询
  • @dji 我认为如果你命名空间,你可以只查询“汽车”集合,但实际过程仍然相当于两个不同的集合查询。是这个意思吗?
  • @fancy 它们将是两个独立的集合(jdi 是对的,独立的查询)。示例:gist.github.com/2431396

标签: javascript node.js mongodb


【解决方案1】:

我想我会发布一个实际的答案,因为它已经在 cmets 中得到了充分的散列(另一个答案不够好)。

将所有内容保存在一个集合中的好处是:

  • 可以在一次查询中查询所有记录
  • 可以使用稀疏索引来有效地索引“当前”记录

将所有内容保存在一个集合中的缺点是:

  • 索引可能需要以“当前”字段引导所有索引,这会占用额外空间并使查找速度变慢
  • 无法使用稀疏索引索引多个字段

将它们分成两个集合的好处是:

  • 您将获得一个免费索引,因此您无需使用“当前”字段引导所有索引
  • 您的“当前”数据将具有更小的索引,可以轻松放入 RAM 中

将它们分成两个集合的缺点是:

  • 您需要运行两个查询才能对整个数据集执行任何操作,然后合并结果

【讨论】:

    【解决方案2】:

    您可以将类型和颜色索引在一起并获得良好的响应时间,无需将它们分开在两个集合中,这不是可维护性的好习惯。您可能需要对两者进行相同的操作,但这样一来,您将需要重复两次。

    【讨论】:

    • 我要补充一点,新车和二手车共享几乎完全相同的一组属性。 “类型”只是另一个具有两个可能值的属性。将它们在该属性上分开,就像开始为不同颜色的汽车创建新系列一样有意义。无论如何,在文档的多个级别上建立索引的能力使搜索保持快速。
    • @jdi 好吧,除了汽车示例之外,还有更多内容。也许它应该是“生产中”的汽车,然后是每辆汽车的背面目录。一组数据将变得更小并且一直被查询,而后面的目录将是巨大的并且很少被查询。我在想如果“生产中”的汽车会一直被使用,你可以通过将它们与大量积压分开来创建更快的查询
    • @fancy:当性能成为一个实际问题时,这就是对密钥进行分片可以为您做的事情。您不必在逻辑上分离“汽车”。只是在某个时候将它们分片到“生产”属性上。如果我认为分片是这里的答案是错误的,那么还有其他解决方案,例如稀疏索引,它们只会在查询中考虑“生产”汽车,因为它们具有稀疏索引。
    • @jdi 您关于 type 是另一个属性的第一条评论是正确的,但是,如果您不需要一起查询它们,将它们分成两个集合,您的索引变得不那么复杂,并且您的响应时间很热数据会更快。另一方面,如果它们确实是相同的架构,那么如果它们在同一个集合中,那么只需设置状态值就可以更容易地将记录迁移到存档状态。
    • 感谢 Mustafa 让我们主宰您的回答主题!
    猜你喜欢
    • 2015-04-05
    • 2014-05-03
    • 2015-02-19
    • 2020-07-26
    • 1970-01-01
    • 2021-05-30
    • 2019-12-04
    • 2012-01-29
    • 2011-04-03
    相关资源
    最近更新 更多