MongoDB Clave Compuesta


Estoy empezando con MongoDB y me he dado cuenta de que tengo una gran cantidad de registros duplicados para las entradas que quería ser único. Me gustaría saber cómo utilizar una clave compuesta mis datos y estoy buscando información sobre cómo crearlos. Por último, estoy usando Java para acceder a mongo y morphia como mi capa OR, por lo que incluirlos en sus respuestas sería increíble.

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

Author: lobster1234, 2011-08-28

3 answers

También puede usar objetos para el campo _id. El campo _id es siempre único. De esa manera se obtiene una clave primaria compuesta:

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

Tenga cuidado al crear estos id de que el orden de las claves (a y b en el ejemplo) importa, si las intercambia, se considera un objeto diferente.

La otra posibilidad es dejar _id solo y crear un compuesto único index .

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 /

 57
Author: Thilo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-23 02:53:20

Puede crear Índices únicos en los campos del documento en el que desea probar la unicidad. También pueden ser compuestos (llamados índices de clave compuesta en MongoDB land), como se puede ver en la documentación. Morphia tiene una anotación @Indexed para apoyar la indexación a nivel de campo. Además con morphia puede definir claves compuestas a nivel de clase con la anotación @Indexed.

 4
Author: lobster1234,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-29 03:52:24

Acabo de notar que la pregunta está marcada como "java", por lo que querrías hacer algo como:

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

También uso Morfina, pero he encontrado (que mientras funciona) que genera muchos errores al intentar ordenar la clave compuesta. Utilizo lo anterior al realizar consultas para evitar estos errores.

Mi código original (que también funciona):

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

Mi clase ProbId está anotada como @Entity(noClassnameStored = true) y dentro de la clase Probabilities, el campo id es @Id ProbId id;

 1
Author: Nic Cottrell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-13 11:50:54