node package manager
Don’t reinvent the wheel. Reuse code within your team. Create a free org »



Mongoose plugin to track likes/dislikes for an object. This is a customisation of the mongoose-votes plugin which changes the terminology to be more appropriate for likes/dislikes.


This plugin is currently unstable and not thoroughly tested. Please refrain from using it at the present time.


Define your schema and add the likes plugin

var mongoose = require('mongoose');
var likesPlugin = require('mongoose-likes');
var postSchema = mongoose.Schema({
    author: ObjectId,
    title: String,
    body: String
var Post = mongoose.model('Post', postSchema);

Like / dislike

var p = ... ; // some post object, function(err) {
p.dislike(dislikerId, function(err) {
// These functions are also defined as statics, likerId, function(err) {
Post.dislike(, dislikerId, function(err) {

If a user changes their mind

p.cancelLike(likerId, function(err) {
p.cancelDislike(dislikerId, function(err) {
// These functions are also defined as statics 
Post.cancelLike(, likerId, function(err) {
Post.cancelDislike(, dislikerId, function(err) {

Finding out what a user has liked/disliked

Find every post a user has liked

Post.findLikes(userId, function(err, likes) {
   // likes is an array of objects with a single property: _id 

Determine if a user has liked a particular post

Post.findLikes(userId, {}, function(err, likes) {
    if (!err) {
        var hasLiked = !!likes.length;

findDislikes works in the same manner

Properties added

p.likes // total number of likes 
p.dislikes // total number of dislikes 
p.score // virtual, likes - dislikes 
p.likers // array of all likers 
p.dislikers // array of all dislikers 


mongoose-likes can be customised in a number of ways. Here is a list of all options with their default values:

postSchema.plugin(likesPlugin, {
    // behaviour 
    disableDislikes: false, // if true, turns off disliking 
    // Property names 
    likesName: 'likes',
    dislikesName: 'dislikes',
    scoreName: 'score',
    likersName: 'likers',
    dislikersName: 'dislikers',
    // Function names 
    likeFuncName: 'like',
    dislikeFuncName: 'dislike',
    cancelLikeFuncName: 'cancelLike',
    cancelDislikeFuncName: 'cancelDislike',
    findLikes: 'findLikes',
    findDislikes: 'findDislikes',
    // other options 
    likerIdType: ObjectId, // The type to use in the likers/dislikers array 
    indexed: false // whether to generate the indexes {_id:1, likers:1}, and {_id:1, dislikers:1}