私に非常に近い多くの質問を読み、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 によると、これは機能するはずです。