web-dev-qa-db-fra.com

Clé composite MongoDB

Je viens de commencer avec MongoDb et j'ai remarqué que je reçois beaucoup d'enregistrements en double pour des entrées que je voulais être uniques. Je voudrais savoir comment utiliser une clé composite pour mes données et je recherche des informations sur la façon de les créer. Enfin, j'utilise Java pour accéder à mongo et morphia comme ma couche ORM, donc inclure ceux dans vos réponses serait génial.

Morphia: http://code.google.com/p/morphia/

30
Paul Gregoire

Vous pouvez également utiliser des objets pour le champ _id. Le champ _id est toujours unique. De cette façon, vous obtenez une clé primaire composite:

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

Faites juste attention lors de la création de ces identifiants que l'ordre des clés (a et b dans l'exemple) compte, si vous les échangez, il est considéré comme un objet différent.

L'autre possibilité est de laisser _id seul et créer un index composé unique .

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/

60
Thilo

Vous pouvez créer Index uniques sur les champs du document sur lesquels vous souhaitez tester l'unicité. Ils peuvent également être composites (appelés index de clés composées dans MongoDB land), comme vous pouvez le voir dans la documentation. Morphia a un @Indexed annotation pour prendre en charge l'indexation au niveau du champ. En plus de la morphie, vous pouvez définir des clés composées au niveau de la classe avec le @Indexed annotation.

4
lobster1234

Je viens de remarquer que la question est marquée comme "Java", donc vous voudriez faire quelque chose comme:

final BasicDBObject id = new BasicDBObject("a", aVal)
        .append("b", bVal)
        .append("c", cVal);
results = coll.find(new BasicDBObjet("_id", id));

J'utilise également Morphia, mais j'ai trouvé (que pendant qu'il fonctionne), il génère beaucoup d'erreurs en essayant de rassembler la clé composite. J'utilise ce qui précède lors des requêtes pour éviter ces erreurs.

Mon code d'origine (qui fonctionne également):

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();

Ma classe ProbId est annotée comme @Entity(noClassnameStored = true) et à l'intérieur de la classe Probabilités, le champ id est @Id ProbId id;

1
Nic Cottrell