35

我刚刚开始使用 MongoDb,我注意到我得到了很多重复的记录,这些记录是我想要唯一的。我想知道如何为我的数据使用复合键,我正在寻找有关如何创建它们的信息。最后,我使用 Java 来访问 mongo 和 morphia 作为我的 ORM 层,因此在您的答案中包含这些内容会很棒。

吗啡:http ://code.google.com/p/morphia/

4

4 回答 4

68

您也可以将对象用于 _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/

于 2011-08-29T03:00:20.453 回答
4

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

于 2011-08-28T22:06:08.763 回答
3

我刚刚注意到这个问题被标记为“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;

于 2012-11-12T19:58:46.693 回答
0

我将尝试用一个例子来解释:

  1. 创建table音乐
  2. 添加Artistprimary 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)
于 2021-03-02T08:43:46.240 回答