sql >> Database >  >> NoSQL >> MongoDB

Mongoose-aggregatie met geonear

U kunt hiervoor het aggregatieraamwerk gebruiken en er is geen echte boete omdat de bewerkingen in wezen hetzelfde zijn.

Maar terwijl de mangoest .find() methode heeft momenteel een probleem met de $nearSphere operator die equivalent is, kunt u altijd het onbewerkte knooppuntstuurprogramma-verbindingsobject pakken en uw vraag stellen.

Je hoeft niet eens dingen als "bevolking" weg te gooien als je bereid bent om er een beetje mee om te gaan.

Dit zijn mijn testgegevens:

{ 
    "_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")
}

En de basiscode om dit aan te pakken:

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 ) );
      });

    });

  }
);

Dus daar heb je het gebruik van zowel de overslaan en limiet bewerkingen op de cursor, kreeg een cursor terug en verwerkte zelfs de documenten terug in "Mongoose-documenten", zodat u functies zoals .populate() kunt aanroepen op hen.

Ik zou het huidige probleem verwachten met $nearSphere relatief snel te repareren.

Of gebruik in plaats daarvan aggregaat:

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 ) );
    });

  }
);

Waar u dezelfde dingen kunt doen, zoals .populate() . gebruiken . Beide gevallen retourneren resultaten zoals deze met het "ingevulde" veld dat overeenkomt:

{
    "_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
        ]
    }
}

Als je de berekening van de sferische geometrie niet nodig hebt, dan is de $near operator werkt prima met de Mongoose-implementatie van .find()



  1. Mongoose slaat genest object niet op

  2. Waar is de meteoor MongoDB-database?

  3. Een MongoDB-query naar een ander systeem sturen:converteren naar JSON en vervolgens decoderen naar BSON? Hoe doe je dat in Go-taal?

  4. PHP MongoDB telt records