mongodb – Encuentra el documento con el valor entero más cercano

Supongamos que tengo una colección con documentos con un atributo de razón que es un número de coma flotante.

{'ratio':1.437} 

¿Cómo escribo una consulta para encontrar el documento individual con el valor más cercano a un número entero dado sin cargarlos todos en la memoria usando un controlador y encontrar uno con el menor valor de abs(x-ratio) ?

Problema interesante. No sé si puedes hacerlo en una sola consulta, pero puedes hacerlo en dos:

 var x = 1; // given integer closestBelow = db.test.find({ratio: {$lte: x}}).sort({ratio: -1}).limit(1); closestAbove = db.test.find({ratio: {$gt: x}}).sort({ratio: 1}).limit(1); 

Luego, solo verifica cuál de los dos documentos tiene la ratio más cercana al entero objective.

Actualización de MongoDB 3.2

La versión 3.2 agrega soporte para el operador de agregación de valor absoluto $abs que ahora permite que esto se haga en una única consulta aggregate :

 var x = 1; db.test.aggregate([ // Project a diff field that's the absolute difference along with the original doc. {$project: {diff: {$abs: {$subtract: [x, '$ratio']}}, doc: '$$ROOT'}}, // Order the docs by diff {$sort: {diff: 1}}, // Take the first one {$limit: 1} ]) 

Tengo otra idea, pero muy complicada y necesito cambiar tu estructura de datos.

Puede usar el índice de geolocalización que admite mongodb

Primero, cambie sus datos a esta estructura y mantenga el segundo valor con 0

 {'ratio':[1.437, 0]} 

Luego puede usar $near operator para encontrar el valor de relación más cercano, y dado que el operador devuelve una lista ordenada por distancia con el número entero que proporciona, debe usar limit para obtener solo el valor más cercano.

 db.places.find( { ratio : { $near : [50,0] } } ).limit(1) 

Si no quieres hacer esto, creo que puedes usar la respuesta de @ JohnnyHK 🙂

Intereting Posts