MongoDB复合键

Pau*_*ire 30 java mongodb morphia

我刚刚开始使用MongoDb,我注意到我获得了许多重复记录,我认为这些记录是独一无二的.我想知道如何为我的数据使用复合键,我正在寻找有关如何创建它们的信息.最后,我使用Java来访问mongo和morphia作为我的ORM层,因此在你的答案中包括那些将是非常棒的.

Morphia:http://code.google.com/p/morphia/

Thi*_*ilo 60

您也可以将对象用于_id字段._id字段始终是唯一的.这样你就可以获得一个复合主键:

 { _id : { a : 1, b: 1} }
Run Code Online (Sandbox Code Playgroud)

在创建这些ID时要小心,键的顺序(示例中的a和b)很重要,如果你交换它们,它被认为是一个不同的对象.

另一种可能性是单独留下_id并创建一个独特的复合指数.

db.things.ensureIndex({firstname: 1, lastname: 1}, {unique: true});
//Deprecated since version 3.0.0, is now an alias for db.things.createIndex()
Run Code Online (Sandbox Code Playgroud)

https://docs.mongodb.org/v3.0/reference/method/db.collection.ensureIndex/

  • 实际上我想出来了,只是查询{"_ id.x":"something"}并且它适用于密钥中的任何字段(尽管性能因其正常性而异). (2认同)
  • @GiovanniBotta 你提到你发现你可以在查询中使用“_id.x”。如果这样做,则无法利用“_id”字段(默认值)中的索引。相反,你可以像 Thilo 提到的那样做,比如:{ "_id" : { $gte: { a : 1 }, $lt: { a : 2 } } }。语法可能略有偏差,但重点是您使用子文档与“_id”进行比较,而不是直接与“_id.x”进行比较 (2认同)
  • 非常感谢您指出复合 _id 键字段顺序很重要!由于您的帮助,我们已经找到了我们在 MongoDB 聚合中引入的错误,在该错误中,我们按与 Spring Data 域对象声明的顺序不同的字段分组。 (2认同)