我刚刚开始使用MongoDb,我注意到我获得了许多重复记录,我认为这些记录是独一无二的。我想知道如何为我的数据使用复合键,我正在寻找有关如何创建它们的信息。最后,我使用Java来访问mongo和morphia作为我的ORM层,所以在你的答案中包括那些将是很棒的。
答案 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)
我会试着用一个例子来解释:
table
音乐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)