MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Agregasi luwak dengan geonear

Anda dapat menggunakan kerangka kerja agregasi untuk ini dan tidak ada hukuman nyata karena operasinya pada dasarnya sama.

Tapi sementara luwak .find() metode saat ini memiliki masalah dengan $nearSphere operator yang setara, Anda selalu dapat mengambil objek koneksi driver node mentah dan melakukan kueri Anda.

Anda bahkan tidak perlu membuang hal-hal seperti "populasi" jika Anda siap menerapkan sedikit penanganan.

Ini data pengujian saya:

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

Dan kode dasar untuk menangani ini:

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

    });

  }
);

Jadi, Anda dapat menggunakan keduanya lewati dan batas operasi pada kursor, kursor dikembalikan dan bahkan memproses dokumen kembali menjadi "Dokumen Mongoose" sehingga Anda dapat memanggil fungsi seperti .populate() pada mereka.

Saya mengharapkan masalah saat ini dengan $nearSphere akan segera diperbaiki.

Atau gunakan agregat sebagai gantinya:

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

  }
);

Di mana Anda dapat melakukan hal yang sama seperti menggunakan .populate() . Kedua kasus mengembalikan hasil seperti ini dengan bidang "diisi" yang cocok:

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

Tentu saja jika Anda tidak memerlukan perhitungan geometri bola maka $near operator bekerja dengan baik dengan implementasi Mongoose dari .find()



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Di mana mongoimport diinstal pada Mac OS X

  2. Batasi sisipan di mongodb

  3. Bagaimana cara menyebarkan gambar Docker mongoDB ke Elastic Beanstalk?

  4. Deserialisasi MongoDB BSON

  5. Cara query dengan beberapa kondisi dan kondisi itu tergantung