考虑到最多有100,000个朋友的下面竞争性的模式,我希望找到最适合我的需求的最有效的方案。
Doc1(在user_id上建立索引)
{
"_id" : "…",
"user_id" : "1",
friends : {
"2" : {
"id" : "2",
"mutuals" : 3
}
"3" : {
"id" : "3",
"mutuals": "1"
}
"4" : {
"id" : "4",
"mutuals": "5"
}
}
}
Doc2(在user_id和friends.id上创建的复合多键索引)
{
"_id" : "…",
"user_id" : "1",
friends : [
{
"id" : "2",
"mutuals" : 3
},
{
"id" : "3",
"mutuals": "1"
},
{
"id" : "4",
"mutuals": "5"
}
]}
我似乎找不到任何关于子字段检索效率的信息。我知道Mongo将数据在内部实现为BSON,所以我想知道投影查找是否是二进制O(log n)?
具体来说,给定一个用户ID,查找是否存在带有朋友ID的朋友,那么这两个不同模式下的查询如何比较?(假设上述索引)请注意,返回什么并不重要,只要如果该朋友存在,则返回非空。
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(logn)操作吗(其中n是朋友数量)?
对于模式2,查询Doc2col.update({user_id : "…", "friends.id" : "friend_id"}, {"$set": {"friends.$.mutuals" : 5})
与上述内容相比如何?