2013-01-07 52 views
8

我有一個mongo對象,並希望通過mongoose訪問我的網絡應用程序。我定義的模式有一個Object存儲用戶ID和一個3級值(是的,也許或不)。貓鼬可變密鑰名稱

例如上述

"user_info": { 
    "<id_value_1>": "y", 
    "<id_value_2>": "n" 
} 

id_value_* s爲用戶會話ID這樣的隨機字符的長字符串。我如何爲此創建一個mongooseSchema

  1. user_info: {String, String}會工作嗎?

  2. 我可以重構它,以便user_info是一個對象數組{ "sessionid": "<value>", "value: "y"},這將是好的,這是最好的選擇嗎?

回答

8

如果避免在您的架構動態密鑰,並用你的第二個想法去你會好起來的$ positional operatorsessionid來更新個體user_info陣列元素。

+0

您能否詳細說明爲什麼避免使用動態密鑰更好?這是因爲貓鼬不能處理它嗎? – ruX

+3

@ruX你不能索引動態密鑰,他們很難建立查詢,你不能爲他們定義一個有用的Mongoose模式...... – JohnnyHK

0

測試以上後,我發現,定義模式爲user_info: { String: String }是這樣做(在問題指定的選項1)有效的方式。

+0

我相信這個選項不起作用,因爲我實現了這個改變Web應用程序失敗,所以請參閱@JohnnyHK的答案 –

0

您可以在模式中定義對象和數組。你甚至可以把它們合併。例如,這是對象的數組:

user_info: [{sessionid: String, value: String}] 

您可以使用:

var user = new Schema({ 
    foo: [ { 
     address: {type: String}, 
     email: {type: String, unique: true} 
    }], 
    bar: [ "simple", "array" ] 
}); 
+1

我的問題與密鑰沒有像「地址」這樣的簡單名稱有關,而是在代碼中生成了密鑰,但是這是根據第2部分生成的有效方法。我的問題 –

3

您可以用混合像這樣

var user = new Schema({ 
    info: [Schema.Types.Mixed] 
}); 

user.info = { any: { thing: 'i want' } }; 
user.markModified('info'); 

你可以閱讀更多架構類型嘗試一下吧here