我刚刚开始使用 MongoDb,我注意到我得到了很多重复的记录,这些记录是我想要唯一的。我想知道如何为我的数据使用复合键,我正在寻找有关如何创建它们的信息。最后,我使用 Java 来访问 mongo 和 morphia 作为我的 ORM 层,因此在您的答案中包含这些内容会很棒。
4 回答
您也可以将对象用于 _id 字段。_id 字段始终是唯一的。这样你就可以得到一个复合主键:
{ _id : { a : 1, b: 1} }
在创建这些 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()
https://docs.mongodb.org/v3.0/reference/method/db.collection.ensureIndex/
您可以在要测试唯一性的文档字段上创建唯一索引。正如您从文档中看到的那样,它们也可以是复合的(在 MongoDB 中称为复合键索引)。Morphia 确实有一个@Indexed
注释来支持字段级别的索引。除了 morphia 之外,您还可以使用@Indexed
注释在类级别定义复合键。
我刚刚注意到这个问题被标记为“java”,所以你想做类似的事情:
final BasicDBObject id = new BasicDBObject("a", aVal)
.append("b", bVal)
.append("c", cVal);
results = coll.find(new BasicDBObject("_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)
在 Probabilities 类中,id 字段是@Id ProbId id;
我将尝试用一个例子来解释:
- 创建
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)