kilik52
kilik52

Reputation: 664

How to keep an array member count

I'm using nodeJS + Express + Mongoose + mongoDB

Here's my mongoDB User Schema:

{
  friends: [ObjectId]
  friends_count: Number
}

Whenever user adds a friend, a friendId will be pushed into friends array, and friends_count will be increased by 1.

Maybe there are a lot of actions will change the friends array, and maybe I will forgot to increase the friends_count. So I want to make sure that friends_count always equal to friends.length

Is there a good way or framework to make sure all of that?

P.S
I know how to update friends_count. What I mean is what if I forgot to?
Is there a way to automatically keep these two attributes sync?

Upvotes: 0

Views: 75

Answers (2)

Khay
Khay

Reputation: 1570

All you need to do is to update friends_count in both add and remove functions. For example:

User.findById(userId, function (err, user) {
    if (user) {
        user.friends.push(friendId);
        user.friends_count++;
        user.save();
    }
});

FYI, I don't think it is necessary to add friends_count while you can get total numbers of friends by friends.length.

Upvotes: 1

Blakes Seven
Blakes Seven

Reputation: 50416

Use the $ne operator as a "query" argument to .update() and the $inc operator to apply when that "friend" did not exist within the array as you $push the new member:

User.update(
    { "_id": docId, "friends": { "$ne": friendId } },
    {
        "$push": { "friends": friendId },
        "$inc": { "friends_count": 1 }
    },
    function(err,numberAffected) {

    }     
)

Or to "remove" a friend from the list, do the reverse case with $pull:

User.update(
    { "_id": docId, "friends": friendId },
    {
        "$pull": { "friends": friendId },
        "$inc": { "friends_count": -1 }
    },
    function(err,numberAffected) {

    }     
)

That way your friends_count stays in sync with the number of array elements present.

Upvotes: 1

Related Questions