MongoDB:字段速度(“内部记录”)搜索在“全局范围”中搜索速度的搜索

时间:2011-08-09 13:50:01

标签: mongodb performance nosql

我的问题可能不是很好,因为我还没有和MongoDB合作过,所以我想知道一件事。

我的数据库中有一个对象(记录/文档/其他任何东西) - 在全球范围内。

在这个对象中有一大堆其他对象。

那么,全球范围内的搜索速度与搜索"内部"宾语?是否可以索引所有"内部"记录?

事先谢谢。

所以,就像这样

users: {
..
user_maria:
{
  age: "18",
  best_comments :
    {
      goodnight:"23rr",
      sleeptired:"dsf3"
     ..
    }
}

user_ben:
{
  age: "18",
  best_comments :
    {
      one:"23rr",
      two:"dsf3"
     ..
    }
}

那么,我怎样才能快速找到user_maria-> best_comments->晚安(集合的索引上下文" best_comment")?

2 个答案:

答案 0 :(得分:2)

首先,您的示例架构非常值得怀疑。如果要嵌入注释(这是一个很大的if),您需要将它们存储在数组中以进行适当的索引。另外,以JSON格式发布模式,这样我们就不必解析整个名称/值的事情了:

db.users {
    name:"maria",
    age: 18,
    best_comments: [
        {
            title: "goodnight",
            comment: "23rr"
        },
        {
            title: "sleeptired",
            comment: "dsf3"
        }
    ]
}

考虑到这个模式,您可以在name和best_comments.title上添加一个索引,例如:

db.users.ensureIndex({name:1, 'best_comments.title:1})

然后,当您想要提到的查询时,只需执行

db.users.find({name:"maria", 'best_comments.title':"first"})

数据库将点击索引并将非常快速地返回此文档。

现在,所有这一切。您的架构非常值得怀疑。您提到要查询特定注释,但这需要注释在单独的集合中,或者您需要过滤注释数组app-side。另外,在文档中具有巨大的,不断增长的嵌入式阵列可能成为问题。文档有16mb的限制,如果文件大小一直在增加mongo将不得不在磁盘上连续移动它们。

我的建议:

  • 将评论放在单独的集合中
  • 每个评论都要做文件或者发表评论桶文件(比方说, 每篇文章100条评论) 阅读Mongo / NoSQL架构设计。您总是查询根文档,因此如果您最终需要大型嵌入式结构的一小部分,则需要重新检查您的架构,否则您将通过连接抽取大量文档并需要应用程序端过滤。

答案 1 :(得分:1)

我不确定我理解你的问题,但听起来你有一条有很多属性的记录。

record = {'attr1':1,'attr2':2,等等}

您可以为任何单个属性或任何属性组合创建索引。此外,您可以在单个集合(MongoDB集合== MySQL表)上创建任意数量的索引,无论集合中的每个记录是否都具有索引的属性。

编辑:我不知道MongoDB中'全局范围'是什么意思。要插入任何数据,您必须定义数据库和集合以插入该数据。

数据库'示例':

收藏'table1':

   records: {a:1,b:1,c:1}

            {a:1,b:2,d:1}

            {a:1,c:1,d:1}

   indices:

            ensureIndex({a:ascending, d:ascending})   <- this will index on a, then by d;  the fact that record 1 doesn't have an attribute 'd' doesn't matter, and this will increase query performance

编辑2:

首先,在这里的表格中,您要为属性“name”和“value”分配多个值。 MongoDB将忽略/覆盖它们的原始实例,因此只有最终的实例才会包含在集合中。

我认为您需要在此处重新考虑您的架构。您尝试将其用作一系列键值对,并不特别适合这种情况(如果您真的需要键值对,请查看Redis)。

退房:http://www.jonathanhui.com/mongodb-query