sql >> Databasteknik >  >> NoSQL >> MongoDB

$geoNear matchar närmaste array

För det första rekommenderar jag starkt att du skapar ett "2dsphere"-index för din samling om du tänker göra geospatiala frågor om verkliga koordinater.

Se till att släppa andra index som du kanske har spelat med:

db.records.dropIndexes();
db.records.createIndex({ "addresses.loc": "2dsphere" })

För att göra vad du vill, ta först en titt på den lilla modifieringen som också inkluderar includeLocs alternativet för att $geoNear

db.records.aggregate([
  { "$geoNear": {
     "near": [ -73.9815103, 40.7475731 ],
     "spherical": true,
     "distanceField": "distance",
     "includeLocs": "locs"
  }}
])

Nu kommer du att se utdata som ser ut så här:

{
        "_id" : ObjectId("592d0c78555a7436b0883960"),
        "userid" : 7,
        "addresses" : [
                {
                        "apporx" : 50,
                        "loc" : [
                                -73.98137109999999,
                                40.7476039
                        ]
                },
                {
                        "apporx" : 15,
                        "loc" : [
                                -73.982002,
                                40.74767
                        ]
                },
                {
                        "apporx" : 10,
                        "loc" : [
                                -73.9819567,
                                40.7471609
                        ]
                }
        ],
        "distance" : 0.0000019174641401278624,
        "locs" : [
                -73.98137109999999,
                40.7476039
        ]
}

Så det som returnerade var inte bara avståndet till punkten som var närmast utan "vilken" plats var tändstickan som användes.

Så om du ville $filter den ursprungliga arrayen för att returnera den närmaste, då kan du:

db.records.aggregate([
  { "$geoNear": {
     "near": [ -73.9815103, 40.7475731 ],
     "spherical": true,
     "distanceField": "distance",
     "includeLocs": "locs"
  }},
  { "$addFields": {
    "addresses": {
      "$filter": {
        "input": "$addresses",
        "as": "address",
        "cond": { "$eq": [ "$$address.loc", "$locs" ] }
      }
    }
  }}
])

Och det returnerar arrayen med bara den matchningen:

{
        "_id" : ObjectId("592d0c78555a7436b0883960"),
        "userid" : 7,
        "addresses" : [
                {
                        "apporx" : 50,
                        "loc" : [
                                -73.98137109999999,
                                40.7476039
                        ]
                }
        ],
        "distance" : 0.0000019174641401278624,
        "locs" : [
                -73.98137109999999,
                40.7476039
        ]
}



  1. Laravel Caching med Redis är väldigt långsam

  2. Hur extraherar man distinkta värden från en mongodatabas med Waterline och Sails.js (version 0.10)?

  3. hur man tar bort array med värdet null efter unset i mongodb

  4. Ansluter till MongoDB 3.0 med Java Spring