MongoDB Композитный ключ
Я только начинаю работать с MongoDb и заметил, что получаю много повторяющихся записей для записей, которые я хотел бы назвать уникальными. Я хотел бы знать, как использовать составной ключ для моих данных, и я ищу информацию о том, как их создать. Наконец, я использую Java для доступа к монго и морфию в качестве своего уровня ORM, поэтому включение тех, кто находится в ваших ответах, было бы здорово.
4 ответа
Вы также можете использовать объекты для поля _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/
Вы можете создавать уникальные индексы в тех полях документа, на которых вы хотите проверить уникальность. Они также могут быть составными (так называемые составные ключевые индексы на земле MongoDB), как вы можете видеть из документации. Морфия действительно имеет @Indexed
аннотация для поддержки индексации на уровне поля. Кроме того, с помощью morphia вы можете определить составные ключи на уровне класса с помощью @Indexed
аннотаций.
Я только что заметил, что вопрос помечен как "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 @Id ProbId id;
Попробую пояснить на примере:
- Создать
table
Музыка - Добавить как
primary key
Теперь, когда у исполнителя может быть много песен, нам нужно выяснить, а. Комбинация обоих будет
composite key
.
Это означает, что + будет уникальным.
что-то вроде этого:
{
"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)