如何在 MongoDB 中将多个字段设置为主键?

How can I set multiple fields as primary key in MongoDB?

我正在尝试创建一个包含 50 多个字段的集合。我理解主键的目的是唯一标识一条记录。由于主键是自动创建的 MongoDB 中的 _id,难道我的所有记录(包括重复记录)都将进入我的数据库并具有唯一的 _id 用于 evert 记录,这不是很明显吗?告诉我我要去哪里 wrong.Other 文章和讨论更混乱。

  1. 如何将其他字段中任意one/more设为主键?但我不想将默认的 _id 作为主键。

  2. 复合索引在哪些方面不同于compound/primary键?

除非您的 Mongo 安装是分片的,否则您可以在多个字段上创建一个唯一的复合索引并将其用作代理复合主键。

db.collection.createIndex( { a: 1, b: 1 }, { unique: true } )

或者您可以创建自己的 _id 值。但是,由于默认的 ObjectId 也是一个时间戳,我个人觉得它对审计很有用。

关于复合索引和复合主键的区别,根据定义,主键不能定义在缺失(空)字段上,并且每个文档只能有一个主键。在 MongoDB 中只有 _id 字段可以用作主键,因为缺少时默认添加。相反,复合索引可以通过将其定义为 parse 来应用于缺失字段,并且您可以在同一文档上定义多个复合索引。

MongoDB 中没有主键这样的概念。术语很重要。不知道术语是有人没有阅读文档或至少没有仔细阅读文档的明确标志。

集合中的文档必须有一个_id字段,可以并且默认是一个ObjectId。该字段上有一个索引,它强制执行唯一约束,因此 _id 字段中不能有任何两个具有相同值或值组合的文档。根据您的描述,这大概就是您想要的。

我的建议是尽可能多地重复使用默认值 _id。额外的索引很昂贵(RAM-wise)。您在这里有两个选择:使用不同的单个值作为 _id 或使用多个值,如果单个字段的基数不够的话。

让我们假设您想要记录每个用户的点击流。显然,您需要拥有唯一的用户。但这还不够,因为一个用户只能有一个条目。但是由于每次点击都需要一个时间戳,因此将其移至 _id 字段:

{
  _id:{
    user: "some user",
    ts: new ISODate()
  },
  ...
}