2012-05-12 71 views
1

假設我有一個用戶模式如下MongoDB是否支持複合鍵的概念?

var User = new db.Schema({ 
    username : {type: String, unique: true} 
    , password : String 
    , email: String 
}); 

爲了適應用戶有朋友我想修改架構如下

var User = new db.Schema({ 
    username : {type: String, unique: true} 
    , password : String 
    , email: String 
    , friends: [?] 
}); 

而不是僅僅存儲的ObjectID我在想的使數據庫非規範化以獲得更快的查詢。假設現在我只想將ObjectId和用戶名存儲在friends數組中。是否有可能做類似

friends: [{String, String}] 

其中兩個字符串表示ObjectId和用戶名?我不想創建一個全新的模式,因爲我不需要一個新的ObjectId。

回答

3

當然,你可以做到這一點,但我真的建議命名領域裏,如(在蒙戈外殼語法):

user = { 
    '_id' : ObjectId(....), 
    'username' : 'derick', 
    'password' : 'notmypw', 
    'email' : '[email protected]', 
    'friends' : [ 
     { 'id': ObjectId(....), 'username' : 'adam' }, 
     { 'id': ObjectId(....), 'username' : 'ross' }, 
    ] 
}; 

但是,你(當然)沒有存儲的ObjectId畢竟,因爲你的username已經是唯一的。哎呀,你甚至可以使一個用戶的用戶名作爲ID爲_id領域:

user = { 
    '_id' : 'derick', 
    'password' : 'notmypw', 
    'email' : '[email protected]', 
    'friends' : [ 
     { 'username' : 'adam' }, 
     { 'username' : 'ross' }, 
    ] 
}; 

我想在貓鼬,你就必須做到這一點像(閱讀「定義文件中的文檔」在http://mongoosejs.com/docs/model-definition.html

var Friend = new db.Schema({ 
    username : String 
}); 

var User = new db.Schema({ 
    username : {type: String, unique: true} 
    , password : String 
    , email: String 
    , friends: [Friend] 
}); 
+0

謝謝你碰巧知道這個語法是如何轉化爲Mongoose.js的?我已經嘗試了一些combintaions,但沒有任何作品。文檔似乎無法處理這種情況http://mongoosejs.com/docs/model-definition.html – deltanovember

+0

補充說,我的回答 – Derick