2016-03-24 6 views
0

zähle ich NodeJS + Express + Mongoose + mongoDBWie halten ein Array Mitglied

Hier ist mein mongoDB User-Schema bin mit:

{ 
    friends: [ObjectId] 
    friends_count: Number 
} 

Jedes Mal, wenn Benutzer einen Freund hinzufügt, wird ein friendID in gedrückt werden freunde array, und friends_count wird um 1 erhöht.

Vielleicht gibt es eine Menge von Aktionen wird die Freunde-Array ändern, und vielleicht werde ich vergessen, die freunde_count zu erhöhen. Also möchte ich sicherstellen, dass friends_count immer gleich friends.length

Gibt es einen guten Weg oder Rahmen, um das alles sicherzustellen?

P.S
Ich weiß, wie man friends_count aktualisiert. Was ich meine, ist was, wenn ich es vergessen habe?
Gibt es eine Möglichkeit, diese beiden Attribute automatisch zu synchronisieren?

Antwort

1

Verwenden Sie den $ne Operator als „Abfrage“ Argument .update() und der $inc Operator anzuwenden, wenn dieser „Freund“ nicht, wie Sie innerhalb des Arrays existieren $push das neue Mitglied:

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

    }  
) 

Or einen Freund aus der Liste zu „entfernen“, tun das Gegenteil Fall mit $pull:

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

    }  
) 

auf diese Weise Ihren friends_count bleibt synchron mit der Anzahl der vorhandenen Array-Elemente.

+0

danke für deine antwort. Ich weiß, wie man friends_count aktualisiert. Was ich meine ist was, wenn ich es vergessen habe? Gibt es eine Möglichkeit, diese beiden Attribute automatisch zu synchronisieren? – kilik52

+0

@ kilik52 Das ist was passiert. MongoDB selbst ist "schemal" und verfolgt solche Dinge nicht. Wenn Sie alle Ihre Operationen zum Hinzufügen und Entfernen aus dem Array wie folgt konstruieren, dann sind sie sicher und atomar und ** immer ** verfolgen die korrekte Anzahl. Sie können Hooks zu einem Mungo-Schema hinzufügen, aber das erfordert ein '.find()' und '.save()' Muster, das niedlicher "sicher" oder "skalierbar" ist. –

+0

in der Theorie werden sie ** immer ** synchronisieren. aber ich fand in meinem db, gelegentlich waren sie unsync. und ich kann nicht herausfinden warum ... – kilik52

1

Alles, was Sie tun müssen, ist friends_count in Add-und Remove-Funktionen zu aktualisieren. Zum Beispiel:

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

FYI, glaube ich nicht, es notwendig ist, friends_count hinzufügen, während Sie Gesamtzahl der Freunde von friends.length bekommen.

+0

Manchmal wird nur freunde_count benötigt. Ich kann nur "friends_count" auswählen. Wird es irgendein Leistungsproblem verursachen, wenn ich ein großes Freundesarray von der DB abrufe? – kilik52

Verwandte Themen