Este es el trato. Supongamos que tenemos el siguiente esquema de datos en MongoDB:¿Cómo lidiar con las relaciones de muchos a muchos en MongoDB cuando la incrustación no es la respuesta?
items
: una colección de grandes documentos que contienen algunos datos (que es absolutamente irrelevante lo que realmente es).item_groups
: una colección con documentos que contienen una lista deitems._id
llamadaitem_groups.items
más algunos datos adicionales.
Por lo tanto, estos dos están vinculados con una relación de Muchos a Muchos. Pero hay una cosa complicada: por alguna razón no puedo almacenar elementos dentro de los grupos de artículos, así que, como dice el título, la incrustación no es la respuesta.
La consulta que realmente me preocupa tiene como objetivo encontrar algunos grupos en particular que contienen algunos elementos en particular (es decir, tengo un conjunto de criterios para cada colección). De hecho, también tiene que decir cuánto elementos dentro de cada grupo encontrado se ajustan a los criterios (ningún elemento significa que no se encuentra el grupo).
La única solución viable que se me ocurrió hasta aquí es utilizar un mapa/Reducir enfoque con un maniquí reducir la función:
function map() {
// imagine that item_criteria came from the scope.
// it's a mongodb query object.
item_criteria._id = {$in: this.items};
var group_size = db.items.count(item_criteria);
// this group holds no relevant items, skip it
if (group_size == 0) return;
var key = this._id.str;
var value = {size: group_size, ...};
emit(key, value);
}
function reduce (key, values) {
// since the map function emits each group just once,
// values will always be a list with length=1
return values[0];
}
db.runCommand({
mapreduce: item_groups,
map: map,
reduce: reduce,
query: item_groups_criteria,
scope: {item_criteria: item_criteria},
});
La línea problema es:
item_criteria._id = {$in: this.items};
¿Y si esto .items.length == 5000 o incluso más? Mi fondo RDBMS llora en voz alta:
SELECT ... FROM ... WHERE whatever_id IN (over 9000 comma-separated IDs)
definitivamente no es una buena manera de ir.
¡Muchísimas gracias por su tiempo, muchachos!
espero que la mejor respuesta será algo así como "eres estúpido, dejar de pensar en el estilo de RDBMS, utilice $ its_a_kind_of_magicSphere de la última versión de MongoDB" :)
Cuando se habla de "incrustación", ¿está hablando de DBReferences -> http://www.mongodb.org/display/DOCS/ Base de datos + referencias # DatabaseReferences-Javascript% 28mongoshell% 29? – DrColossos
Estoy hablando de la incrustación real, es decir, el almacenamiento de un documento dentro de otro. p.ej. comment = {user: 'DrColossos', texto: '¿de qué estás hablando?'}; pregunta = {x: 13, y: 42, comentarios: [comentario]}. –
Si crea una relación Muchos a Muchos con una tabla intermedia y consulta eso? ¿No resolverá eso tu problema? – Qqbt