MongoDB复合键

时间:2011-08-28 16:07:15

标签: java mongodb morphia

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

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

4 个答案:

答案 0 :(得分:60)

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

 { _id : { a : 1, b: 1} }

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

另一种可能性是单独留下_id和create a unique compound index

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

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

答案 1 :(得分:4)

您可以在要测试唯一性的文档字段上创建Unique Indexes。它们也可以是复合的(在MongoDB中称为复合键索引),正如您可以从文档中看到的那样。 Morphia确实有一个@Indexed注释来支持字段级别的索引。除了morphia之外,您还可以使用@Indexed注释在类级别定义复合键。

答案 2 :(得分:1)

我刚注意到这个问题被标记为“java”,所以你想做的事情如下:

final BasicDBObject id = new BasicDBObject("a", aVal)
        .append("b", bVal)
        .append("c", cVal);
results = coll.find(new BasicDBObjet("_id", id));

我也使用Morphia,但已经发现(当它工作时)它会在尝试编组复合键时产生大量错误。我在查询时使用上面的代码来避免这些错误。

我的原始代码(也适用):

final ProbId key = new ProbId(srcText, srcLang, destLang);
final QueryImpl<Probabilities> query = ds.createQuery(Probabilities.class)
  .field("id").equal(key);
Probabilities probs = (Probabilities) query.get();

我的ProbId类注释为@Entity(noClassnameStored = true),在概率类中,id字段为@Id ProbId id;

答案 3 :(得分:0)

我会试着用一个例子来解释:

  1. 创作table音乐
  2. Artist 添加为 primary key

现在由于艺术家可能有很多歌曲,我们必须找出sort key。 两者的组合将是 composite key

意思是,Artist + SongTitle 将是唯一的。

像这样:

{
"Artist" : {"s" : "David Bowie"},
"SongTitle" : {"s" : "changes"},
"AlbumTitle" : {"s" : "Hunky"},
"Genre" : {"s" : "Rock"},
}

Artist 上面的键是:Partition Key 上面的 SongTitle 键是:sort key

两者的组合总是唯一的或应该是唯一的。其余的属性可能因记录而异。

一旦你有了这个数据结构,你就可以根据你的自定义查询轻松地附加和扫描。

示例 Mongo 查询以供参考:

db.products.insert(json file path)
db.collection.drop(json file path)
db.users.find(json file path)