Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

Вы также можете использовать объекты для поля _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/

Ответ 2

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

Ответ 3

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