2012-12-19 63 views
1

我想在用戶的文檔中緩存來自社交媒體的朋友,並且遇到存儲/取回問題的問題。首先,我盲目地將他們的朋友緩存去掉,然後用新的數據提取來填充它,但是通過我發現嵌入式文檔在所有用戶中必須是唯一的(我有幾個朋友是在我的測試帳戶一樣,我也得到:從Mongoose獲取現有的嵌入式文檔

{"name":"MongoError","err":"E11000 duplicate key error index: test-dev.users.$friends.outsideID_1 dup key: { : \"1205314313242\" }","code":11001,"n":0,"connectionId":274,"ok":1} 
從這個

,所以我知道,因爲嵌入文檔中我的其他已註冊的和更新的帳戶存在無法創建文件(outsideID是指數,因爲我計劃) 然後我開始嘗試OutsideFriend.find({'outsideID':{$ in:friendsIDs}}(其中friendsIDs是我從SM查詢獲得的ID的數組),等等。然後在回調中,我會嘗試添加新朋友並添加存在將文檔添加到有問題的用戶,以便它不會在系統中複製它。然而,無論出於何種原因OutsideFrind.find()永遠不會返回任何文檔......這使我認爲嵌入式文檔不是集中式的......但爲什麼第一次嘗試失敗?

我該怎麼做? (模式下面,請讓我知道如果你需要任何其他信息!)

當前模式:

//External friend model                                                
var OutsideFriend = new Schema({ 
     outsideID:{type:String, index:true, unique:true} 
     ,username:String 
     ,location:String 
     ,avatarURL:String 
}); 

//User model                                                   
var User = new Schema({ 
     avatarURL:String 
     ,mySMID:String 
    //Social Media info                                                 
     ,smID:{type:String, index:true, unique:true} 
     ,tok:String 
     ,tokSec:String 
     ,friends:[OutsideFriend] 
}; 

回答

1

有很多你的問題怎麼回事,但如果你想查詢OutsideFriend獨立的User,那麼你不應該將它們嵌入到User模型中。相反,只需將ObjectId引用給朋友,然後populate即可在User中獲得完整詳細信息。除非您發現需要引入一致性挑戰,否則不要過早地使用嵌入式副本進行優化。

所以你User模式將改變爲:

var User = new Schema({ 
    avatarURL:String 
    //Social Media info 
    ,smID:{type:String, index:true, unique:true} 
    ,tok:String 
    ,tokSec:String 
    ,friends:[{type: ObjectId, ref: 'OutsideFriend'}] 
}; 
+0

好了,本來這個想法被緩存在用戶文檔的SM朋友的名單,因此這個想法是有一個獨特的用戶的用戶列表,並我認爲它們是完全獨立的,所以如果userA和userB都是Bob的朋友,那就沒有問題了,但顯然我錯了,因爲我從上面得到了這個錯誤。那麼你打算怎麼做?我可以將它移動到一個ref並填充哪個是備份計劃(也可能是爲了時間),但我真的很想知道這樣做的「推薦」方法!^^ –

+0

@MatthewClark當您嵌入數組字段中的另一個模式(與'friends'一樣),那麼在該模式中定義的任何索引都會在嵌入(父)模式的集合中創建。在這種情況下,唯一的索引意味着沒有兩個'User'文檔可以在其'friends'數組中包含同名的'OutsideFriend'。因此,嵌入包含唯一索引的模式很少是您想要的。我建議爲'friends'創建一個單獨的模式,如果您仍然想要使用嵌入式方法,那麼不需要包含僅需要緩存的字段的唯一索引。 – JohnnyHK

+0

你不覺得嵌入式方法是最高性能的方法嗎?我將搜索這個緩存以向用戶顯示他們哪個SM朋友在這個系統上。 –

相關問題