猫鼬Mongo 2dsphere geoWithin

时间:2016-04-05 00:32:26

标签: mongodb mongoose geojson mongoose-schema 2dsphere

在阅读了很多与我相近的问题,阅读MongoDB文档和Mongoose文档之后,我仍然无法回答我的问题。

在节点4.4.0上使用express 4.13.4,mongoose 4.4.10,mongodb 2.1.14

我的Mongoose位置架构:

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说这应该有效。

1 个答案:

答案 0 :(得分:0)

我在Mongoose上写了这个问题:https://github.com/Automattic/mongoose/issues/4044#

它已被关闭。