我想在特定日期在聊天中存储特定用户的消息数量。
为了使Id唯一,我认为我应该将这些ID组合在一起,它变成~20个字符长度由ChatId
+ DDMMYY
+ UserId
public class UserContributions
{
[BsonId]
public string ChatIdDateUserId { get; set; }
public int Count { get; set; }
// the rest
}
但我猜这个长度的ID在性能上并不好。这是我应该如何制作一个复杂的ID?
感谢。
答案 0 :(得分:1)
长度不应该太大问题。此外,您可以使用化合物_id
{
_id:{
ChatID: "someId",
Date: ISODate("2017-10-30T00:00:00.000Z"),
UserID: "someUID"
}
}
首先注意一些事项: NOT 使用字符串来表示日期。首先,ISODates存储为64位无符号整数。虽然日期存储为6个字符,但您节省了一些空间,但是您放弃了date operations in aggregations以及normal date comparisons的所有功能。 Bad 的想法。
其次,您的模型容易发生碰撞。同一日期的同一用户只能将一条消息发布到特定聊天。当天的第二条消息将完全相同的值,因此会违反唯一性的约束。所以你实际上必须使用完整的ISODate,直到毫秒。 然而,碰撞的可能性很小(假设您在两个应用程序服务器上生成了一个稍微有点时间的日期)。有there is an additional counter in ObjectId的原因。
以下是我如何建模
{
_id: new ObjectId(),
ChatId: "someChat",
UserId: "someUser"
}
原因:ObjectId包含一个时间戳,您可以通过该时间戳进行查询(我不知道C#是否足以提供示例,因此我会将此作为wiki答案,让其他人有机会这样做),消除不必要的复杂性和<{1}}和ChatId
上的索引足够快。