如何在 MongoDB 中指定 _id 和对象 ID 数组作为复合主键?

How to specify _id and array of Object Ids as a composite primary key in MongoDB?

在 MongoDB 数据库中,创建了一个集合,并插入了一些数据:

>>> db.createCollection("Restaurants")
>> { "ok" : 1 }

>> db.Restaurants.insert({ "_id": "coolDinings",
>> "AppliedParameters": [ ObjectId("5617a7a52da21a733547b8da"),
>> ObjectId("5617a5102da21a733547b8d9") ], "Review": "excellent    SeaFood", "Region": "USA" })

Mongo数据库默认行为是将“_id”视为主键。

但是,我想要一个由以下字段组成的复合主键:

"AppliedParameters" 是一个 ObjectId 数组,它可以根据它存储的 ObjectId 的数量变化,运行从 0 到大约 20 或 30 个 ObjectId。

我知道以下代码将在上述两个字段上创建索引:

db.Restaurants.ensureIndex( { "_id": 1,"AppliedParameters": 1 }, { unique:true, sparse:true } ); 

但是,我的愿望是确保上述代码行将创建一个复合主键。

无论如何我运行代码。

为了检查是否创建了复合键,我只是重新运行再次插入第一个数据,因为我希望它会通过抛出与复合主键重复相关的错误来抱怨:

    >> db.Restaurants.insert({ "_id": "coolDinings",
    >> "AppliedParameters": [ ObjectId("5617a7a52da21a733547b8da"),
    >> ObjectId("5617a5102da21a733547b8d9") ], "Review": "excellent        SeaFood", "Region": "USA" })

但是,它只给出了以下错误:

E11000 重复键错误索引:test.Restaurants.$id 重复键:{ : "coolDinings" }

上述错误似乎表明“_id”重复。我希望 Mongo 客户端声明不允许重复复合主键。

我该如何完成上述任务?

mongodb 中没有 "composite" 个主键(从某种意义上说,它们跨越多个字段)。 _id 是唯一的主键。

如果你想要一个复杂的主键,由几条数据组成,将它们全部插入到_id字段中。

注意 _id 值不能是数组(必须是基元或对象之一)。

不能做:

{ _id: [1, 2, 3] }

可以做到:

{ _id: { a: 1, b: [2, 3] } }