sql >> データベース >  >> NoSQL >> MongoDB

近くのマングースの集合体

    これには集約フレームワークを使用でき、操作は基本的に同じであるため、実際のペナルティはありません。

    しかし、マングースの .find() 現在、メソッドには $nearSphere<に問題があります。 / code> 同等の演算子であるため、いつでもrawノードドライバー接続オブジェクトを取得してクエリを実行できます。

    少しの処理を実装する準備ができていれば、「人口」のようなものを捨てる必要さえありません。

    これが私のテストデータです:

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

    そしてこれを処理するための基本的なコード:

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

    したがって、両方のスキップを使用できます。 および制限 .populate()のような関数を呼び出すことができるように、カーソルを操作し、カーソルを返し、ドキュメントを「MongooseDocuments」に処理して戻しました。 それらに。

    $nearSphere<の現在の問題を予想します。 / code> ただし、比較的早く修正される予定です。

    または、代わりに集計を使用します:

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

    .populate()を使用するなど同じことができる場所 。どちらの場合も、「入力済み」フィールドが一致した次のような結果を返します。

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

    もちろん、球面幾何学の計算が必要ない場合は、 $ near 演算子は、 .find()のMongoose実装で完全に正常に機能します



    1. 埋め込み配列の更新後に新しい値を取り戻すにはどうすればよいですか?

    2. 空の配列を含む配列エントリを削除します

    3. コマンドを使用してmongodbデータとログファイルの場所を見つける方法は?

    4. NoSQLソリューションの比較はありますか(特定の状況ではどちらが優れていますか?)