Mongoose plugin to allow "pusher" and "puller" functions which acts like setters for arrays.
npm install mongoose-pusher --save
var mongoose = require('mongoose')
, Schema = mongoose.Schema
, pusherPlugin = require('mongoose-pusher');
var SomeSchema = new Schema({
someArrayField: {
type: [String], // can be any type
push: function (val) { return modify(val); }
pull: function (val) { this.notifyValueBeingPulled(val); }
}
});
SomeSchema.plugin(pusherPlugin);
SomeSchmea.methods.notifyValueBeingPulled = function (val) {
/*...*/
};
var SomeModel = mongoose.model('SomeModel', SomeSchema);
// These functions call the setter, which is custom from the plugin
var someObject = new SomeModel({
someArrayField: ['a', 'b', 'c'] // called through modified setter
});
someObject.set('someArrayField', ['c', 'b', 'a']);
// These functions are modified to call the pusher
someObject.someArrayField.push('x', 'y', 'z');
someObject.someArrayField.nonAtomicPush('i', 'j', 'k');
someObject.someArrayField.unshift('xx', 'yy');
// These call pusher and puller (if necessary)
someObject.someArrayField.splice(1, 4, 'zj1', 'fix')
someObject.someArrayField.set(8, 'foo');
// These call the puller
someObject.someArrayField.pull('foo', 'bar');
someObject.someArrayField.pop();
someObject.someArrayField.$pop();
someObject.someArrayField.shift();
someObject.someArrayField.$shift();
push
andpull
are called for each element of the array and are never called with more than one element (no need to slice arguments).push
is called for each element to be added to the array whenever the array is constructed with elements or one ofpush
,nonAtomicPush
,set
,addToSet
,splice
, andunshift
functions are called.addToSet
will callpush
for all elements regardless of whether its already in the set.
pull
is called for each element removed from the array whenever one ofpull
,pop
,$pop
,shift
,$shift
,set
, orsplice
are called.pull
, likeaddToSet
, might call the puller for elements that aren't in the set.
push
andpull
, likeset
, are called with the context of the parent document.push
orpull
are not mutually required or exclusive, that is they do not have to both be specified, but they can be.- Use of
push
will override the setter on the field, so if you put a setter in,push
will not be called upon construction.
npm install -g nodeunit
nodeunit tests.js
MIT found in LICENSE file.