Javascript 名称为“的Mongoose子文档和属性”;“类型”;

Javascript 名称为“的Mongoose子文档和属性”;“类型”;,javascript,mongoose,Javascript,Mongoose,使用Mongoose连接到数据库: var mongoose = require('mongoose'); var poi_schema = mongoose.Schema({ name: String, geo: { // GeoJSON type: String, coordinates: [Number, Number] } }); var Poi = mongoose.model('Poi', poi_schema); var db = mongoos

使用Mongoose连接到数据库:

var mongoose = require('mongoose');

var poi_schema = mongoose.Schema({
  name: String,
  geo: { // GeoJSON
    type: String,
    coordinates: [Number, Number]
  }
});

var Poi = mongoose.model('Poi', poi_schema);


var db = mongoose.connection;
mongoose.connect('mongodb://localhost:27017/test');
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function callback () {
    var poi = new Poi();
    poi.name = 'hello';
    poi.geo.type = 'Point';
    poi.geo.coordinates = [34, 23];
    poi.save(function(err, poi) {
      if (err) console.error('save error', err);
      else console.log(poi._id, poi.name, 'saved');
    });
});
这将失败,错误为
TypeError:无法设置未定义的属性“type”

只要我把“type”这个词改成别的词,它就行了。
为什么?实际上,我正在尝试使用2dsphere索引存储GeoJSON,我认为这需要将字段名称为“type”。还有猫鼬,它不起作用

你必须这样做:

  geo: { // GeoJSON
    type: {type: String},
    coordinates: [Number, Number]
  }

对于使用2dsphere索引,您不需要键入:“Point”属性,除非您想存储的不仅仅是Point。

当您输入
type:String
时,mongoose认为geo有String类型。哦!!我懂了。我明白为什么现在会这样。