MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Agregacja mangusty z geonear

Możesz użyć do tego ram agregacji i nie ma żadnej rzeczywistej kary, ponieważ operacje są zasadniczo takie same.

Ale podczas gdy mangusta .find() metoda ma obecnie problem z $nearSphere operatora, który jest równoważny, zawsze możesz pobrać surowy obiekt połączenia sterownika węzła i wykonać zapytanie.

Nie musisz nawet wyrzucać rzeczy takich jak „populacja”, jeśli jesteś przygotowany na wprowadzenie niewielkiej obsługi.

Oto moje dane testowe:

{ 
    "_id" : "P1",
    "amenity" : "restaurant", 
    "shape" : { 
        "type" : "Point", 
        "coordinates" : [ 2, 2 ] 
    }
}
{ 
    "_id" : "P3",
    "amenity" : "police",
    "shape" : { 
        "type" : "Point", 
        "coordinates" : [ 4, 2 ]
    }
}
{ 
    "_id" : "P4",
    "amenity" : "police",
    "shape" : {
        "type" : "Point",
        "coordinates" : [ 4, 4 ]
    }
}
{ 
    "_id" : "P2",
    "amenity" : "restaurant",
    "shape" : { 
        "type" : "Point",
        "coordinates" : [ 2, 4 ]
    }, 
    "info" : ObjectId("539b90543249ff8d18e863fb")
}

I podstawowy kod do obsługi tego:

var mongoose = require('mongoose'),
    async = require('async'),
    Schema = mongoose.Schema;


mongoose.connect('mongodb://localhost');

var infoSchema = new Schema({
  "description": String
});

var shapeSchema = new Schema({
  "_id": String,
  "amenity": String,
  "shape": {
    "type": { "type": String },
    "coordinates": []
  },
  "info": { "type": Schema.Types.ObjectId, "ref": "Info" }
});

var Shape = mongoose.model( "Shape", shapeSchema );
var Info = mongoose.model( "Info", infoSchema );


Shape.collection.find(
  {
    "shape": {
      "$nearSphere": {
        "$geometry": {
          "type": "Point",
          "coordinates": [ 2, 4 ]
        }
      }
    }
  },
  {
    "skip": 0, "limit": 2
  },
  function(err,cursor) {

    cursor.toArray(function(err,shapes) {

      Shape.populate( shapes, { path: "info" }, function(err,docs) {
        if (err) throw err;

        console.log( JSON.stringify( docs, undefined, 4 ) );
      });

    });

  }
);

Więc masz użycie obu pomiń i limit operacje na kursorze, zwrócił kursor, a nawet przetworzył dokumenty z powrotem na „Dokumenty Mongoose”, dzięki czemu można wywoływać funkcje takie jak .populate() na nich.

Spodziewałbym się obecnego problemu z $nearSphere jednak wkrótce zostanie naprawiony.

Lub zamiast tego użyj agregatu:

Shape.aggregate(
  [
    { "$geoNear": {
        "near": {
          "type": "Point",
          "coordinates": [ 2, 4 ]
        },
        "spherical": true,
        "distanceField": "dis"
    }},
    { "$skip": 0 },
    { "$limit": 2 }

  ],
  function(err,shapes) {
    if (err) throw err;
    //console.log( shapes );

    shapes = shapes.map(function(x) {
      delete x.dis;
      return new Shape( x );
    });

    Shape.populate( shapes, { path: "info" }, function(err,docs) {
      if (err) throw err;

      console.log( JSON.stringify( docs, undefined, 4 ) );
    });

  }
);

Gdzie możesz robić te same rzeczy, takie jak użycie .populate() . Oba przypadki zwracają takie wyniki z dopasowanym polem „wypełnione”:

{
    "_id": "P2",
    "amenity": "restaurant",
    "info": {
        "_id": "539b90543249ff8d18e863fb",
        "description": "Jamies Restaurant",
        "__v": 0
    },
    "shape": {
        "type": "Point",
        "coordinates": [
            2,
            4
        ]
    }
},
{
    "info": null,
    "_id": "P4",
    "amenity": "police",
    "shape": {
        "type": "Point",
        "coordinates": [
            4,
            4
        ]
    }
}

Oczywiście, jeśli nie potrzebujesz obliczeń geometrii sferycznej, $blisko operator działa doskonale z implementacją Mongoose .find()



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB BasicDBObject vs dokument w java

  2. MongoDB w Go z mgo, operatory z bson.M / bson.D zawsze mają błąd składni

  3. heroku mongohq i mongoid Mongo::Błąd połączenia

  4. Meteor:nieoczekiwany kod wyjścia mongo null. Ponowne uruchamianie. Co to jest?

  5. 5 najważniejszych zalet współdzielonego hostingu MongoDB