2

私に非常に近い多くの質問を読み、MongoDB のドキュメントと Mongoose のドキュメントを読んだ後でも、質問に答えることができません。

Node 4.4.0でexpress 4.13.4、mongoose 4.4.10、mongodb 2.1.14を使用

私のマングースの場所のスキーマ:

var schema = new Schema({
  type: {type: String},
  coordinates: []
},{_id:false});

var model = mongoose.model('LocationModel',schema);

module.exports = {
   model :  model,
   schema : schema
};

私のCatalogModelスキーマ(Mongoに書いたもの):

var locationSchema = require('./locationModel').schema;
var schema = new Schema({
    title : String, 
    format: {type: String, maxlength: 4},
    location: {type: locationSchema, required:true},
    otherStuff: String
});
schema.index({location: '2dsphere'}); // Ensures 2dsphere index for location

model = mongoose.model('CatalogModel',schema);

具体的な例を作成し、MongoDB に書き込みます (これは正常に動作します... Mongo でクエリを実行できるという点で)

var polyEntry = new CatalogModel({
    title:"I am just a Polygon",
    otherStuff: "More stuff here",
    location:{
        type:'Polygon',
        coordinates:[[[0,1],[0,2],[1,2],[0,1]]]
    }
});

Mongo では、コレクションにインデックスを要求しました。

db.catalogmodels.getIndexes()

そして、これはそれが言っていることです(これが何を意味するのか完全にはわかりません)

[
    {
        "v" : 1,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "test.catalogmodels"
    },
    {
        "v" : 1,
        "key" : {
            "location" : "2dsphere"
        },
        "name" : "location_2dsphere",
        "ns" : "test.catalogmodels",
        "background" : true,
        "2dsphereIndexVersion" : 3
    }
]

を実行してdb.catalogmodels.find()、ドキュメントを取り戻すことができます。

{ 
    "_id" : ObjectId("12345678901234566778"), 
    "title" : "I am just a Polygon", 
    "location" : { 
        "type" : "Polygon", 
        "coordinates" : [ [ [ 0, 1 ], [ 0, 2 ], [ 1, 2 ], [ 0, 1 ] ] ] 
    },        
    "__v" : 0 
}

Mongo で $geoWithin 呼び出しを行うこともできます。

db.catalogmodels.find(
    {
        location:{
            $geoWithin:{
                $geometry:{
                    type:"Polygon",
                    "coordinates":[[[-1,0],[-1,3],[4,3],[4,0],[-1,0]]]
                }
            }
        }
    })

しかし、実際の質問は次のとおりです。

Mongoose は私に言い続けます[エラー: $geoWithin を使用できません]

var geoJson = { 
    "type" : "Polygon", 
    "coordinates" : [[[-1,0],[-1,3],[4,3],[4,0],[-1,0]]] 
};
CatalogModel
.find()
.where('location').within(geoJson)
.exec(function(err,data){
    if ( err ) { console.log(err); }
    else {console.log("Data: " + data);}
    db.close()
});

また、.find().where().within() 呼び出しを次のように置き換えました。

CatalogEntryModel.find({
    location:{
        $geoWithin:{
            $geometry:{
                type:"Polygon",
                "coordinates":[[[-1,0],[-1,3],[4,3],[4,0],[-1,0]]]
            }
        }
    }
})
.exec(function(err,data){
    if ( err ) { console.log(err); }
    else {console.log("Data: " + data);}
    db.close();
});

Mongoose が $geoWithin 呼び出しを好まない理由はありますか? 最新の API によると、これは機能するはずです。

4

1 に答える 1