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