我的问题可能不是很好,因为我还没有和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")?
答案 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将不得不在磁盘上连续移动它们。
我的建议:
答案 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)。