Indstillingen under $geoNear
er includeLocs
som følger:
Store.aggregate([
{ "$geoNear": {
"near": [ -70.64341379999999, -33.4268697 ],
"distanceField": "distance",
"maxDistance": 0.0900899926955034,
"includeLocs": "location"
}}
])
Outputtet har den matchede "placering" til "afstanden" i outputfeltet:
{
"_id" : ObjectId("5507b18d1c3bdce0535aecd0"),
"name" : "store1",
"branchoffices" : [
{
"name" : "bo1",
"location" : [
-70.64341379999999,
-33.4268697
]
},
{
"name" : "bo2",
"location" : [
80.4,
43.3
]
}
],
"distance" : 0,
"location" : [
-70.64341379999999,
-33.4268697
]
}
Hvis du ville have det specifikke underdokument i det array, der blev brugt i kampen i fuld detalje, kunne du fortsætte med et filter ved hjælp af $redact
:
Store.aggregate([
{ "$geoNear": {
"near": [ -70.64341379999999, -33.4268697 ],
"distanceField": "distance",
"maxDistance": 0.0900899926955034,
"includeLocs": "location"
}},
{ "$redact": {
"$cond": [
{ "$eq": [ "$location", "$$ROOT.location" ] },
"$$DESCEND",
"$$PRUNE"
]
}}
])
Eller i versioner før MongoDB 2.6 som denne:
Store.aggregate([
{ "$geoNear": {
"near": [ -70.64341379999999, -33.4268697 ],
"distanceField": "distance",
"maxDistance": 0.0900899926955034,
"includeLocs": "location"
}},
{ "$unwind": "$branchoffices" },
{ "$project": {
"name": 1,
"branchoffices": 1,
"matched": {
"$eq": [ "$location", "$branchoffices.location" ]
}
}},
{ "$match": { "matched": 1 } },
{ "$group": {
"_id": "$_id",
"name": { "$first": "$name" },
"branchoffices": { "$push": "$branchoffices" },
"distance": { "$first" "$distance" }
}}
])
Du skal nok bemærke, at brug af objekter i et underdokument ikke altid er en optimal løsning og generelt ikke egnet til en række opgaver. For eksempel, hvis dine data i arrayet muligvis indeholdt "flere" placeringer, der ville være "nær" det forespurgte punkt, så ville kun det ental "nærmeste" punkt kunne matches på denne måde.
Så mens du kan gøre dette, er det bedst at overveje, hvordan du bruger det, og de resultater, du forventer. I de fleste tilfælde bør lokationsdata være opført i dets eget dokument i stedet for under et underdokumentarray, som det gøres her.