鉴于以下与100,000名朋友竞争的模式,我有兴趣为我的需求找到最高效的模式。MongoDB嵌入与数组子文档性能
文档1(指数上USER_ID)
{
"_id" : "…",
"user_id" : "1",
friends : {
"2" : {
"id" : "2",
"mutuals" : 3
}
"3" : {
"id" : "3",
"mutuals": "1"
}
"4" : {
"id" : "4",
"mutuals": "5"
}
}
}
文档2
{
"_id" : "…",
"user_id" : "1",
friends : [
{
"id" : "2",
"mutuals" : 3
},
{
"id" : "3",
"mutuals": "1"
},
{
"id" : "4",
"mutuals": "5"
}
]}
我似乎无法找到的任何信息(化合物的多键上user_id的& friends.id指数)子字段检索的效率。我知道mongo在内部将数据实现为BSON,所以我想知道这是否意味着投影查找是二进制O(log n)?
具体来说,给定一个user_id来查找是否存在friend_id的朋友,那么每个模式上的两个不同查询会如何比较? (假设上述索引)请注意,返回的内容并不重要,只有在朋友存在时才返回null。
Doc1col.find({user_id : "…"}, {"friends.friend_id"})
Doc2col.find({user_id : "…", "friends.id" : "friend_id"}, {"_id":1})
另外值得关注的是$ set修饰符是如何工作的。对于架构1,给定查询Doc1col.update({user_id : "…"}, {"$set" : {"friends.friend_id.mutuals" : 5})
,friends.friend_id上的查找工作如何?这是一个O(log n)操作(其中n是朋友的数量)?
对于模式2,查询Doc2col.update({user_id : "…", "friends.id" : "friend_id"}, {"$set": {"friends.$.mutuals" : 5})
与上述数据的比较如何?
与数组样式(Doc2)一起使用,动态键几乎从来都不是正确的方法。另外,不要使用明智的引号(这不是合法的语法,而且很难阅读)。 – JohnnyHK
我想Doc2会像一些额外的存储空间一样用完,但是@JohnnyHK说Doc1并不是一个好方法,请相信我使用Doc1的人的问题数量,然后意识到他们必须转向Doc2来做任何事情与他们的架构... – Sammaye
感谢您的意见。 @Sammaye为什么Doc2会占用几个字节的额外存储空间?你指的是索引吗?顺便说一句聪明的报价是从复制粘贴 –