MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Nhận tài liệu phụ của geoNear - MongoDB

Tùy chọn trong $geoNear 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.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. làm thế nào để ngăn đăng nhập trên bảng điều khiển khi kết nối với mongodb từ java?

  2. Làm cách nào để đếm số lần xuất hiện của mỗi giá trị trong mảng?

  3. Cách tích hợp Pyramid 1.1 và Mongo DB - càng ít dòng càng tốt

  4. Tại sao MongoDB không thể sử dụng một chỉ mục phức hợp rất giống (không chính xác) với truy vấn?

  5. Hợp nhất bộ sưu tập Mongodb và Python Dict