2016-03-24 7 views
0

を数える維持する方法+エクスプレス+マングース+ MongoDBのアレイメンバーは、私がnodeJSを使用してい

は、ここに私のMongoDBユーザー・スキーマです:

は、ユーザーが友人を追加するたびに
{ 
    friends: [ObjectId] 
    friends_count: Number 
} 

、friendIdが中に押し込まれます友人の配列、friends_countは1ずつ増加します。

多分、友達の配列を変更するアクションがたくさんありますし、friends_countを増やすのを忘れてしまうかもしれません。だから私はfriends_countがfriends.lengthと常に等しいことを確認したいです

これを確認する良い方法やフレームワークはありますか?

P.S
friends_countを更新する方法は分かっています。私が忘れてしまったのはどういう意味ですか?
これら2つの属性を自動的に同期させる方法はありますか?

答えて

1

は、「友人」はあなたのように、アレイ内$push新しいメンバーが存在しなかったときに適用する.update()$incオペレータに「クエリ」引数として$ne演算子を使用します。

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

    }  
) 

しますか、リストから友人を「削除」することは、$pullと逆の場合の操作を行います。

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

    }  
) 

その方法をごfriends_countは存在する配列要素の数と同期している。

+0

あなたの答えに感謝します。私はfriends_countを更新する方法を知っています。私が何を意味するのは、もし私が忘れたら?これらの2つの属性を自動的に同期させる方法はありますか? – kilik52

+0

@ kilik52これは何が起こっているのですか? MongoDB自体は "無作為"であり、そのようなことは追跡しません。このように配列を追加したり削除したりするすべての操作を工夫すれば、それらは安全でアトミックで**常に**正確な数を追跡します。あなたはmongooseスキーマにフックを追加することができますが、それは "安全"または "スケーラブル"である '.find()'と '.save()'パターンを必要とします。理論的には –

+0

です**常に**同期します。しかし、私は私のデータベースで、時には非同期であった。私は理由を知ることができません.... – kilik52

1

あなたがする必要があるのは、追加機能と削除機能の両方でfriends_countを更新することだけです。たとえば:FYI

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

、私はあなたがfriends.lengthで友人の総数を取得することができながら、friends_countを追加する必要はないと思います。

+0

友だちのみが必要な場合もあります。私は "friends_count"だけを選択できます。 DBから大規模なフレンドアレイを取得すると、パフォーマンス上の問題が発生しますか? – kilik52

関連する問題