tutorial query queries que fields all mongodb

query - show all documents mongodb



¿Orden de las respuestas a MongoDB $ en la consulta? (6)

Esta pregunta ya tiene una respuesta aquí:

Los documentos MongoDB en el operador condicional $in no dicen nada sobre el orden. Si ejecuto una consulta del formulario

db.things.find({''_id'': {''$in'': id_array}});

¿Cuál será el orden de los resultados devueltos? ¿Y hay alguna manera de decirle a MongoDB "Quiero que los resultados se clasifiquen para que estén en el mismo orden que los id_array en id_array ?"



La respuesta de @Jason es la correcta.

Acerca de otras respuestas: No recomendaría las consultas una a una, ya que pueden traer serios problemas de rendimiento.

Además de la respuesta de @Jason, se puede optimizar utilizando los métodos Array.reduce y Array.map, como este:

//The order you want var queryIds = [8, 5, 3, 7]; //The results from MongoDB in an undefined order var resultsFromMongoDB = [ {_id: 7, data: "d"}, {_id: 8, data: "a"}, {_id: 5, data: "b"}, {_id: 3, data: "c"} ]; var reorderedResults = naturalOrderResults(resultsFromMongoDB, queryIds); function naturalOrderResults(resultsFromMongoDB, queryIds) { //Let''s build the hashmap var hashOfResults = resultsFromMongoDB.reduce(function (prev, curr) { prev[curr._id] = curr; return prev; }, {}); return queryIds.map( function(id) { return hashOfResults[id] } ); }


Preguntado por esta característica en JIRA :

Rápidamente obtuvo una muy buena respuesta: use $or lugar de $in

c.find( { _id:{ $in:[ 1, 2, 0 ] } } ).toArray()

vs.

c.find( { $or:[ { _id:1 }, { _id:2 }, { _id:0 } ] } ).toArray()

Lea el informe de error para más información.

Actualización :

El $ o el truco de reparación ya no funciona a partir de 2.6.x; fue un efecto colateral de la implementación el que ha changed .


Si no le molesta usar Underscore.js y no está demasiado preocupado por la escala (es decir, no le molesta cargar en lugar de trabajar con el cursor), así es como mantuve el orden:

var results = db.things.find({''_id'': {''$in'': id_array}}).fetch(); return _.sortBy(results, function(thing) { return id_array.indexOf(thing._id); });


Tuve el mismo problema y mi solución fue crear un mapa hash para hacer la asignación entre mi matriz de ID (mi consulta) y mi matriz de resultados de MongoDB.

El trabajo adicional es explorar la matriz de resultados e insertar, para cada elemento, un nuevo par clave-valor: la clave es la ID y el valor es el objeto resultante.

Luego, cuando quiero buscar mis resultados en el mismo orden que mi consulta, puedo usar el hashmap para recuperar el objeto correcto. Sin clasificación y sin una elegante opción de Mongo DB.

En Javascript sería algo así como:

//The order you want var queryIds = [ 8, 5, 3, 7 ]; //The results from MongoDB in an undefined order var resultsFromMongoDB = [ {_id: 7, data: "d" }, {_id: 8, data: "a" }, {_id: 5, data: "b" }, {_id: 3, data: "c" }, ]; //The function to create a hashmap to do the mapping function createHashOfResults( results ){ var hash = {}; for( var i = 0 ; i < results.length ; i++ ){ var item = results[i]; var id = item._id; hash[ id ] = item; } return hash; } //Let''s build the hashmap var hash = createHashOfResults( resultsFromMongoDB ); //Now we can display the results in the order we want for( var i = 0 ; i < queryIds.length ; i++ ){ var queryId = queryIds[i]; var result = hash[queryId]; console.log( result.data ); }

Esto mostrará:

a b c d


el orden de los resultados no se menciona porque no se ordenarán de ninguna manera confiable. la única forma de ordenarlos sería hacer consultas separadas por el lado del cliente para cada elemento del conjunto de $ en