gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:12:28 26 4
gpt4 key购买 nike

鉴于以下具有多达 100,000 位 friend 的竞争模式,我有兴趣找到最能满足我需求的模式。

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 的 friend ,每个模式上的两个不同查询将如何比较? (假设上面的索引)注意返回什么并不重要,如果 friend 存在则返回 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 是 friend 的数量)吗?

对于模式 2,查询 Doc2col.update({user_id : "...", "friends.id": "friend_id"}, {"$set": {"friends.$.mutuals": 5}) 和上面的比较?

最佳答案

如果一个人的主要要求是在一个易于管理的包中向用户界面呈现数据,则最好使用 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} }] })

最后一点,但是,可以创建 sparse index在 doc1 上(并使用 $exists),但您可能有 100,000 个 friend ——每个 friend 都需要一个稀疏索引——这很荒谬。相对于合理数量的条目来说,人口统计性别 [男性,女性],年龄组 [0-10,11-16,25-30,..] 或更多暗示的东西 [ Gin ,威士忌,伏特加,...]

关于arrays - MongoDB 嵌入式 vs 数组子文档性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13638122/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com