summaryrefslogtreecommitdiff
path: root/node_modules/mongoose/docs/virtuals.md
diff options
context:
space:
mode:
authorJules Laplace <jules@okfoc.us>2012-09-24 16:22:07 -0400
committerJules Laplace <jules@okfoc.us>2012-09-24 16:22:07 -0400
commit686106d544ecc3b6ffd4db2b665d3bc879a58d8c (patch)
treea5b5e50237cef70e12f0745371896e96f5f6d578 /node_modules/mongoose/docs/virtuals.md
ok
Diffstat (limited to 'node_modules/mongoose/docs/virtuals.md')
-rw-r--r--node_modules/mongoose/docs/virtuals.md84
1 files changed, 84 insertions, 0 deletions
diff --git a/node_modules/mongoose/docs/virtuals.md b/node_modules/mongoose/docs/virtuals.md
new file mode 100644
index 0000000..65bc2bf
--- /dev/null
+++ b/node_modules/mongoose/docs/virtuals.md
@@ -0,0 +1,84 @@
+Virtual attributes
+====================
+
+Mongoose supports virtual attributes. Virtual attributes are attributes
+that are convenient to have around but that do not get persisted to mongodb.
+
+An example is helpful.
+
+## Example
+Take the following schema:
+
+ var PersonSchema = new Schema({
+ name: {
+ first: String
+ , last: String
+ }
+ });
+
+ var Person = mongoose.model('Person', PersonSchema);
+
+ var theSituation = new Person({name: { first: 'Michael', last: 'Sorrentino' }});
+
+Suppose you want to write `theSituation`'s full name. You could do so via:
+
+ console.log(theSituation.name.first + ' ' + theSituation.name.last);
+
+It is more convenient to define a virtual attribute, `name.full`, so you can instead write:
+
+ console.log(theSituation.name.full);
+
+To do so, you can declare a virtual attribute on the Schema, `Person`:
+
+ PersonSchema
+ .virtual('name.full')
+ .get(function () {
+ return this.name.first + ' ' + this.name.last;
+ });
+
+So when you get `name.full`, via
+
+ theSituation.name.full;
+
+the implementation ends up invoking the getter function
+
+ function () {
+ return this.name.first + ' ' + this.name.last;
+ }
+
+and returning it.
+
+It would also be nice to be able to set `this.name.first` and `this.name.last` by setting `this.name.full`. For example, it would be nice if we wanted to change theSituation's `name.first` and `name.last` to 'The' and 'Situation' respectively just by invoking:
+
+ theSituation.set('name.full', 'The Situation');
+
+Mongoose allows you to do this, too, via virtual attribute setters. You can define a virtual attribute setter thusly:
+
+ PersonSchema
+ .virtual('name.full')
+ .get(function () {
+ return this.name.first + ' ' + this.name.last;
+ })
+ .set(function (setFullNameTo) {
+ var split = setFullNameTo.split(' ')
+ , firstName = split[0]
+ , lastName = split[1];
+
+ this.set('name.first', firstName);
+ this.set('name.last', lastName);
+ });
+
+Then, when you invoke:
+
+ theSituation.set('name.full', 'The Situation');
+
+and you save the document, then `name.first` and `name.last` will be changed in monbodb, but the mongodb document will not have persisted a `name.full` key or value to the database:
+
+ theSituation.save(function (err) {
+ Person.findById(theSituation._id, function (err, found) {
+ console.log(found.name.first); // 'The'
+ console.log(found.name.last); // 'Situation'
+ });
+ });
+
+If you want attributes that you can get and set but that are not themselves persisted to mongodb, virtual attributes is the Mongoose feature for you.