Mi base de datos tiene datos en el siguiente formato:
{ "_id" : ObjectId( "abcd" ), "coordinate" : [somevalue, somevalue], "value" : [ { "time" : 1, "characteristics" : "pqrs" }, { "time" : 10, "characteristics" : "pqrs" } ] }Quiero encontrar la coordenada más cercana del campo y un tiempo que sea menor o igual a un valor dado.
Actualmente estoy usando esta consulta:
db.collection.aggregate({ coordinate: { $geoNear: [latitude, longitude], $maxDistance: 10 }, "value.time": { $lte: 5 } })Este devolvió la entrada completa, pero lo que quería es el campo:
{ "time" : 1, "characteristics" : "pqrs" } ¿Es posible incluso devolver este campo? ¿Qué pasa si hay varios resultados y solo quiero el que está más cerca de mi entrada value.time ?
Puede realizar una agregación a:
$match elementos con la coordinate y value.time especificadosvalue $filter para eliminar todo <5$unwind$group por valor máximoconsulta es:
db.collection.aggregate({ $match: { coordinate: { $geoNear: [0, 0], $maxDistance: 10 }, "value.time": { $lte: 5 } } }, { $project: { value: { $filter: { input: "$value", as: "value", cond: { $lte: ["$$value.time", 5] } } } } }, { $unwind: "$value" }, { $group: { _id: "$_id", time: { $max: "$value.time" }, characteristics: { $first: "$value.characteristics" } } })Salida de muestra:
{ "_id" : ObjectId("588a8c3080a14de2d654eb7b"), "time" : 4, "characteristics" : "pqrs" } { "_id" : ObjectId("588a89327fe89686fd2210b2"), "time" : 1, "characteristics" : "pqrs" }