Я только начинаю с MongoDb, и я заметил, что у меня много повторяющихся записей для записей, которые я хотел бы быть уникальными. Я хотел бы знать, как использовать составной ключ для моих данных, и я ищу информацию о том, как их создавать. Наконец, я использую Java для доступа к монго и морфию как к своему слою ORM, поэтому включение в ваши ответы будет потрясающим.
Компонентный ключ MongoDB
Ответ 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;