如何定义复杂的MongoDb文档Id?

时间:2017-10-29 16:25:09

标签: c# mongodb

我想在特定日期在聊天中存储特定用户的消息数量。 为了使Id唯一,我认为我应该将这些ID组合在一起,它变成~20个字符长度由ChatId + DDMMYY + UserId

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

但我猜这个长度的ID在性能上并不好。这是我应该如何制作一个复杂的ID?

感谢。

1 个答案:

答案 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上的索引足够快。