MongoDB:Speed of field(“inside record”(内部记录)搜索速度与搜索速度的组合;“全球范围”;

MongoDB:Speed of field(“inside record”(内部记录)搜索速度与搜索速度的组合;“全球范围”;,mongodb,performance,nosql,Mongodb,Performance,Nosql,我的问题可能不是很好,因为我还没有使用MongoDB,所以我想知道一件事 我的数据库中有一个对象(记录/文档/任何其他内容)-在全局范围内 在这个物体中有一个巨大的其他物体阵列 那个么,全局范围内的搜索速度和“内部”对象的搜索速度如何?是否可以为所有“内部”记录编制索引 先谢谢你 那么像这样, users: { .. user_maria: { age: "18", best_comments : { goodnight:"23rr", sleeptire

我的问题可能不是很好,因为我还没有使用MongoDB,所以我想知道一件事

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

在这个物体中有一个巨大的其他物体阵列

那个么,全局范围内的搜索速度和“内部”对象的搜索速度如何?是否可以为所有“内部”记录编制索引

先谢谢你

那么像这样,

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

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

那么,我如何快速找到用户\u maria->best\u comments->goodnight(收藏的索引上下文“best\u comments”)?

我不确定我是否理解您的问题,但听起来您有一张带有多个属性的记录

记录={'attr1':1,'attr2':2等}

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

编辑:我不知道你所说的MongoDB中的“全局范围”是什么意思。若要插入任何数据,必须定义要将该数据插入的数据库和集合

数据库“示例”:

“表1”集合:

   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
记录:{a:1,b:1,c:1}
{a:1,b:2,d:1}
{a:1,c:1,d:1}
指数:

ensureIndex({a:ascending,d:ascending})首先,您的示例模式非常可疑。如果您想嵌入注释(这是一个很大的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"})
数据库将命中索引,并将很快返回此文档

现在,所有这些都说了。你的模式很可疑。你提到你想查询特定的评论,但这需要评论在一个单独的集合中,或者你在应用端过滤评论数组。此外,在文档中拥有巨大的、不断增长的嵌入式数组可能会成为一个问题。文档有16mb的限制,如果文档大小一直增加,mongo将不得不在磁盘上连续移动它们

我的忠告是:

  • 将评论放在单独的集合中
  • 要么按注释编制文档,要么制作注释桶文档(例如, 每个文件100条评论) 阅读Mongo/NoSQL模式设计。您总是查询根文档,因此如果您最终需要大型嵌入式结构的一小部分,则需要重新检查您的架构,否则您将通过连接发送大量文档,并需要应用程序端过滤

我应该提到的是,记录中的属性数量与这些记录上的查询速度之间存在反向关系。例如,查询每个记录包含100个属性的集合要比查询每个记录包含10个属性的集合慢。我更新了问题,使其更清晰,以理解我的意思。请看一看。另外,您的意思是:搜索速度取决于某个范围内的记录数量?或者。。若我在对象A中添加更多的属性,它会降低对象B请求的速度吗?(如果在单个范围内有?)我的意思是,如果您有两个集合a和B,集合a中的记录有100个属性,集合B中的记录有10个属性,那么对a的查询将比对B的查询花费更长的时间。我抓住了关于属性的问题。在新的更新之后,你不想再看看我的问题吗?你确定这是正确的模式吗。这样存储评论似乎是一个相当糟糕的主意。几年前,当我阅读MongoDB文档时,我发现他们强烈建议将所有引用此记录的内容存储在其中。(这个模型不是很有效-我理解你的意思。假设我在它自己的个人资料记录中有一份最佳用户评论的副本,以便快速显示。更好吗?)。是的。谢谢正如我所说,几年前我在阅读MongoDB文档,所以我有点忘记了JSON和MongoDB,所以我意识到是否有任何功能可以完成我所说的事情。。你说“总是查询根文档”是什么意思?如果我查询
{name:“maria”,'best_comments.title':“first”}
我会在解析整个
maria
对象之前查询它吗?嗯,我有这样的东西:我的系统中有数千个“世界”——每个都有自己的用户基础、内部等等。我想把每个“世界”做成一个带有“用户”、“房间”字段的单一记录。你觉得这是个坏主意吗?是的。您希望能够单独查询用户,因此将他们全部嵌入到world文档中并不是最佳选择。此外,您可能会达到16mb文档限制。好的。谢谢你这么说-我会掉进这个陷阱的。所以,您建议使用单独的用户表,并使用用户字段“world”-对吗?好的。谢谢但由于某些原因,mongo文档中有很多例子,它们将注释存储在与之相关的页面中。那么,关于在与它们相关的页面文档中存储长评论历史,您会怎么说呢。如果我查询
({page:“first”},{“comments”})。限制(10)。跳过(10)
-我通过连接将文档打洞?