mongoose-likes

Mongoose plugin to track likes for an object

mongoose-likes

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.

var mongoose = require('mongoose');
var likesPlugin = require('mongoose-likes');
 
var postSchema = mongoose.Schema({
    author: ObjectId,
    title: String,
    body: String
});
 
postSchema.plugin(likesPlugin);
 
var Post = mongoose.model('Post', postSchema);
var p = ... ; // some post object 
 
p.like(likerId, function(err) {
    ...
});
 
p.dislike(dislikerId, function(err) {
    ...
});
 
// These functions are also defined as statics 
 
Post.like(post.id, likerId, function(err) {
   ...
});
 
Post.dislike(post.id, dislikerId, function(err) {
   ...
});
p.cancelLike(likerId, function(err) {
    ...
});
 
p.cancelDislike(dislikerId, function(err) {
    ...
});
 
// These functions are also defined as statics 
 
Post.cancelLike(post.id, likerId, function(err) {
    ...
});
 
Post.cancelDislike(post.id, dislikerId, function(err) {
    ...
});

Find every post a user has liked

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

Determine if a user has liked a particular post

Post.findLikes(userId, {_id:post.id}, function(errlikes) {
    if (!err) {
        var hasLiked = !!likes.length;
    }
});

findDislikes works in the same manner

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} 
});