鉴于以下具有多达 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)?
具体来说,给定一个 user_id 来查找是否存在具有friend_id 的朋友,每个模式上的两个不同查询将如何比较?(假设上述索引)请注意,返回什么并不重要,如果朋友存在,则返回 not 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})
与上述查询相比如何?