2013-01-07 37 views
8

Tôi có một đối tượng mongo và muốn truy cập nó qua mongoose cho ứng dụng web của tôi. Giản đồ tôi đã xác định có một mã định danh Object lưu trữ người dùng và giá trị 3 cấp (có, có thể hoặc không).Mongoose variable key name

ví dụ:

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

id_value_* s ở trên là id phiên của người dùng do đó, một chuỗi ký tự ngẫu nhiên dài. Làm cách nào để tạo một số mongooseSchema cho điều này?

  1. user_info: {String, String} có hoạt động không?

  2. Tôi có thể cấu trúc lại nó để user_info là một mảng đối tượng { "sessionid": "<value>", "value: "y"}, điều này sẽ ổn, đây có phải là lựa chọn tốt nhất không?

Trả lời

8

Bạn sẽ được tốt hơn nếu bạn tránh phím năng động trong lược đồ và đi với ý tưởng thứ hai của bạn:

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

Bạn có thể sử dụng $ positional operator để cập nhật các thành phần mảng user_info riêng lẻ theo sessionid.

+0

Bạn có thể giải thích tại sao nó tốt hơn để tránh các phím động? Có phải chỉ vì mongoose không thể xử lý nó? – ruX

+3

@ruX Bạn không thể lập chỉ mục các phím động, chúng khó xử lý các truy vấn, bạn không thể xác định giản đồ Mongoose hữu ích cho chúng ... – JohnnyHK

0

Sau khi thử nghiệm ở trên, tôi thấy rằng việc xác định các lược đồ như user_info: { String: String } là một cách hợp lệ để làm điều này (phương án 1 quy định trong câu hỏi).

+0

Tôi tin rằng tùy chọn này không làm việc, kể từ khi tôi thực hiện điều này thay đổi các ứng dụng web thất bại, vì vậy xem câu trả lời từ @JohnnyHK –

0

Bạn có thể xác định các đối tượng và mảng trong giản đồ của mình. Bạn thậm chí có thể kết hợp chúng. Ví dụ, đây là một mảng của các đối tượng:

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

Câu hỏi của tôi liên quan đến thực tế là khóa không có tên đơn giản như 'địa chỉ', thay vì khóa được tạo trong mã, nhưng có, đây là cách hợp lệ theo phần 2. của Câu hỏi của tôi –

3

Bạn có thể thử với loại Schema Mixed như cách này

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

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

Bạn có thể đọc thêm về nó here