2017-10-29 9 views
0

私は特定の日のチャットで特定のユーザーのメッセージの数を保存したいという状況がありました。 は、IDを一意にするために、私は私が一緒に、これらのIDを組み合わせなければならないと思ったし、それは〜文字の長さが20になったChatId + DDMMYY + UserId複雑なMongoDbドキュメントIDを定義する方法は?

public class UserContributions 
{ 
    [BsonId] 
    public string ChatIdDateUserId { get; set; } 
    public int Count { get; set; } 
    // the rest 
} 

から構成さしかし、私はこの長さのIDが良くに関するパフォーマンスではないと思います。私は複雑なIDをどうやって作りますか?

ありがとうございました。

答えて

1

長さはあまり問題にならないはずです。さらに、あなたは最初にいくつかの注意化合物_id

{ 
    _id:{ 
    ChatID: "someId", 
    Date: ISODate("2017-10-30T00:00:00.000Z"), 
    UserID: "someUID" 
    } 
} 

を持つことができます。日付を表すためにませ使用文字列を行います。まず、ISODateは64ビットの符号なし整数として格納されます。日付は6文字で保存されますが、スペースを節約できますが、date operations in aggregationsのすべての機能と、normal date comparisonsのすべての機能が不足しています。 Badアイデア。

第2に、モデルが衝突する可能性があります。同じ日付の同じユーザーは、特定のチャットに1つのメッセージしか投稿できませんでした。 1日の2番目のメッセージにはと同じ値が正確にになるため、一意性の制約に違反します。したがって、実際にはISODateをミリ秒単位で使用する必要があります。 それでもなお、衝突の可能性はわずかです(2つのアプリケーションサーバーで生成された日付があり、時間的には賢明です)。理由は、there is an additional counter in ObjectIdです。私は例を与えるに十分のC#を知らない(のObjectIdはあなたが照会することができたことにより、タイムスタンプが含まれ、それゆえ私はこのウィキになります。ここでは

は私が

{ 
    _id: new ObjectId(), 
    ChatId: "someChat", 
    UserId: "someUser" 
} 

理由、それをモデル化する方法をあります他人にそうする機会を与えるための答え)、不必要な複雑さを排除し、ChatIdUserIdの両方の指標でそれは十分に速いです。

+0

ありがとう@Markus。 (この文書には、特定の日のカウンターやその他の活動情報が含まれています) – Blendester

+0

@Blendster:これは集約の仕事に似ていますか? –

関連する問題