mongoose-likes

Mongoose plugin to track likes for an object

npm install mongoose-likes
3 downloads in the last week
10 downloads in the last month

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.

Status

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

Usage

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

postSchema.plugin(likesPlugin);

var Post = mongoose.model('Post', postSchema);

Like / dislike

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

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(post.id, likerId, function(err) {
    ...
});

Post.cancelDislike(post.id, 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, {_id:post.id}, 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

Options

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}
});
npm loves you