2012-11-10 18 views
5

Tôi có một số thông tin về mô hình mongoose của tôi là thoáng qua. Vì lý do hiệu suất tôi không muốn lưu trữ nó chống lại các mô hình .. Nhưng tôi muốn để có thể cung cấp thông tin này cho khách hàng kết nối với máy chủ của tôi và yêu cầu nó.Phím Mongoose/val được đặt trên ví dụ không hiển thị trong JSON hoặc Bảng điều khiển .. tại sao?

Dưới đây là một ví dụ đơn giản:

var mongoose = require('mongoose'), 
    db = require('./dbconn').dbconn; 

var PersonSchema = new mongoose.Schema({ 
    name : String, 
    age  : Number, 
}); 

var Person = db.model('Person', PersonSchema); 
var fred = new Person({ name: 'fred', age: 100 }); 

Giản đồ Person có hai thuộc tính mà tôi muốn lưu trữ (tên và tuổi) .. này hoạt động .. và chúng ta thấy trong giao diện điều khiển:

console.log(fred); 

{name: 'fred', tuổi: 100, _id: 509edc9d8aafee8672000001}

tôi làm tuy nhiên có một thuộc tính ("trạng thái") thay đổi nhanh chóng và tôi không muốn lưu trữ điều này trong cơ sở dữ liệu .. nhưng tôi muốn theo dõi nó một cách năng động và cung cấp cho khách hàng để tôi thêm nó vào cá thể dưới dạng cặp khóa/cặp.

fred.status = "alive"; 

Nếu chúng ta nhìn vào fred trong giao diện điều khiển một lần nữa sau khi thêm "sống" chìa khóa/cặp val người ta lại thấy fred, nhưng isnt tình trạng của ông thể hiện:

{name: 'fred', tuổi: 100, _id: 509edc9d8aafee8672000001}

Tuy nhiên, cặp khóa/val chắc chắn là có .. chúng ta thấy rằng:

console.log(fred.status); 

renders:

sống

Điều này cũng đúng trong những đại diện JSON của đối tượng mà tôi gửi đến khách hàng .. "trạng thái" isnt bao gồm ..

Tôi không hiểu tại sao .. bất cứ ai có thể giúp đỡ?

Hoặc, cách khác, có cách tiếp cận tốt hơn để thêm thuộc tính vào các lược đồ mongoose không được lưu vào cơ sở dữ liệu không?

+0

Tôi nghĩ rằng đây là một cái gì đó kỳ quặc với các đối tượng cầy mangut. Tôi luôn nối thêm user.avatar làm url gravatar của họ. – chovy

Trả lời

9

thêm dòng sau vào giản đồ của bạn nên làm những gì bạn muốn:

PersonSchema.virtual('status').get(function() { 
    return this._status; 
}); 

PersonSchema.virtual('status').set(function(status) { 
    return this._status = status; 
}); 

PersonSchema.set('toObject', { 
    getters: true 
}); 

này thêm thuộc tính ảo status - nó sẽ không được tiếp tục tồn vì đó là một ảo. Phần cuối cùng là cần thiết để làm cho đầu ra nhật ký bảng điều khiển của bạn chính xác. Từ docs:

Để có tất cả virtuals hiển thị trong kết quả console.log của bạn, thiết lập các tùy chọn toObject để {thu khí: true}

Cũng lưu ý rằng bạn cần phải sử dụng một tài sản nội bộ tên khác với status (ở đây tôi đã sử dụng _status). Nếu bạn sử dụng cùng tên, bạn sẽ nhập một vòng lặp đệ quy vô hạn khi thực thi lệnh get.

+0

Nice .. cảm ơn rất nhiều! Làm việc một điều trị, hoàn hảo. –

+0

Tò mò .. hiển thị trong Bảng điều khiển .. cho đến khi không hiển thị trong JSON được gửi tới máy khách .. –

+1

Bạn có thể gọi 'toObject' trên cá thể của bạn trước khi gửi dữ liệu. Tôi thích ghi đè 'toJSON' như đã thấy [ở đây] (https://groups.google.com/d/topic/mongoose-orm/SHe_Fsso_44/discussion). –

1

Chỉ cần gọi .toObject() trên đối tượng dữ liệu.

Đối với bạn mã sẽ như thế nào:

fred.toObject()

Các vấn đề liên quan