鑑於以下與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會佔用幾個字節的額外存儲空間?你指的是索引嗎?順便說一句聰明的報價是從複製粘貼 –