MongoDB Композитный ключ - PullRequest
       1

MongoDB Композитный ключ

30 голосов
/ 28 августа 2011

Я только начинаю работать с MongoDb и заметил, что получаю много дубликатов записей для записей, которые я хотел бы назвать уникальными.Я хотел бы знать, как использовать составной ключ для моих данных, и я ищу информацию о том, как их создать.Наконец, я использую Java для доступа к монго и морфию в качестве своего слоя ORM, поэтому включение тех из них в ваши ответы было бы здорово.

Морфия: http://code.google.com/p/morphia/

Ответы [ 3 ]

60 голосов
/ 29 августа 2011

Вы также можете использовать объекты для поля _id. Поле _id всегда уникально. Таким образом, вы получаете составной первичный ключ:

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

Просто будьте осторожны при создании этих идентификаторов, чтобы порядок ключей (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/

4 голосов
/ 29 августа 2011

Вы можете создать Уникальные индексы на полях документа, на которых вы хотите проверить уникальность. Они также могут быть составными (так называемые составные ключевые индексы на земле MongoDB), как вы можете видеть из документации. Morphia имеет аннотацию @Indexed для поддержки индексации на уровне поля. Кроме того, с помощью morphia вы можете определять составные ключи на уровне класса с аннотацией @Indexed.

1 голос
/ 12 ноября 2012

Я только что заметил, что вопрос помечен как "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 ProbId id;

...