Сначала вы должны создать двумерный индекс:
db.PostedBy.createIndex({ location: "2dsphere" })
Затем вы можете запустить агрегирование следующим образом:
db.PostedBy.aggregate([
{
$geoNear: {
near: {
type: "Point",
coordinates: [-74, 40]
},
distanceField: "distance",
//maxDistance: 20000, // max. Distance in Meters
spherical: true
}
},
{
$lookup:
{
from: "posts",
localField: "_id",
foreignField: "postedBy",
as: "posts"
}
},
{
$project: {
model: "$posts.model",
price: "$posts.price",
postedBy: { name: "$name", location: "$location" }
}
}
])
Примечание, [-74, 40]
до [90.341044, 23.787105]
больше чем 10 000 км, проверьте введенные значения.
Значения price
и model
возвращаются в виде массива, поскольку у вас может быть более одного поста для каждого «PostedBy». Если вы хотите получить один элемент, добавьте { $set: { model: { $arrayElemAt: ["$model", 0] } } }
или { $unwind: "$model" }
, соответственно. price