繁体   English   中英

MongoDB嵌入式vs数组子文档性能

[英]MongoDB embedded vs array sub document performance

鉴于以下竞争模式与多达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的朋友,每个模式上的两个不同查询将如何比较? (假设上面的索引)请注意,返回的内容并不重要,只有在朋友存在时才返回非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})比较以上的?

如果一个人的主要要求是在一个漂亮的可管理包中向ui提供数据,那么doc1更受欢迎。 使用投影{}, {friends.2 : 1}只过滤所需数据很简单

doc2是你最强的匹配,因为你的用例并不关心结果请注意,返回的内容并不重要 ,索引会加快获取速度。

在那个doc2之上允许更清晰的语法

db.doc2.findOne({user_id: 1, friends.id : 2} )

db.doc1.findOne({ $and : [{ user_id: 1 }, { "friends.2" : {$exists: true} }] })

然而,最后一点,人们可以在doc1上创建一个稀疏索引 (并使用$ exists),但你有10万朋友的可能性 - 每个朋友需要一个稀疏索引 - 这使得这很荒谬。 反对合理数量的条目说人口统计学性别[男性,女性],年龄组[0-10,11-16,25-30,...]或更多的东西[杜松子酒,威士忌,伏特加,......]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM