Tùy chọn trong $geoNear
là includeLocs
như sau:
Store.aggregate([
{ "$geoNear": {
"near": [ -70.64341379999999, -33.4268697 ],
"distanceField": "distance",
"maxDistance": 0.0900899926955034,
"includeLocs": "location"
}}
])
Đầu ra có "vị trí" phù hợp với "khoảng cách" trong trường đầu ra:
{
"_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
]
}
Nếu bạn muốn tài liệu con cụ thể trong mảng được sử dụng trong trận đấu với đầy đủ chi tiết thì bạn có thể tiếp tục với bộ lọc bằng cách sử dụng $redact
:
Store.aggregate([
{ "$geoNear": {
"near": [ -70.64341379999999, -33.4268697 ],
"distanceField": "distance",
"maxDistance": 0.0900899926955034,
"includeLocs": "location"
}},
{ "$redact": {
"$cond": [
{ "$eq": [ "$location", "$$ROOT.location" ] },
"$$DESCEND",
"$$PRUNE"
]
}}
])
Hoặc trong các phiên bản trước MongoDB 2.6 như thế này:
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" }
}}
])
Bạn có thể nên lưu ý rằng việc sử dụng các đối tượng trong một tài liệu con không phải lúc nào cũng là một giải pháp tối ưu và thường không phù hợp với nhiều tác vụ khác nhau. Ví dụ:nếu dữ liệu của bạn trong mảng có thể chứa "nhiều" vị trí "gần" điểm được truy vấn, thì chỉ điểm "gần nhất" duy nhất mới có thể được đối sánh như thế này.
Vì vậy, trong khi bạn có thể làm điều này, tốt nhất là xem xét cách bạn đang sử dụng nó và kết quả bạn mong đợi. Trong hầu hết các trường hợp, dữ liệu vị trí nên được liệt kê trong tài liệu riêng của nó thay vì trong mảng tài liệu phụ như được thực hiện ở đây.