无法使用位置字段创建Mongoose对象

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法使用位置字段创建Mongoose对象相关的知识,希望对你有一定的参考价值。

使用Mongoose,我无法将位置数据插入数据库:

Can't extract geo keys from object, malformed geometry?

似乎POST请求没问题(日志A):它有一个位置('loc')字段,但我从这个POST请求创建的对象缺少'loc'字段数据:

这是我的架构:

车型/ Article.js

var ArticleSchema = new mongoose.Schema({
    slug: {type: String, lowercase: true, unique: true},
    title: String,
    description: String,
    body: String,
    loc :  { type: {type:String}, coordinates: [Number]},
    favoritesCount: {type: Number, default: 0},
    comments: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Comment' }],
    tagList: [{ type: String }],
    author: { type: mongoose.Schema.Types.ObjectId, ref: 'User' }
}, {timestamps: true});

ArticleSchema.index({loc: '2dsphere'});

路线/ Article.js

router.post('/', auth.required, function(req, res, next) {
  User.findById(req.payload.id).then(function(user){
      if (!user) { return res.sendStatus(401); }

      var article = new Article(req.body.article);

      // LOG A
      console.log(req.body.article);

      // LOG B
      console.log(article);

      article.author = user;

      return article.save().then(function(){
         return res.json({article: article.toJSONFor(user)});
      });
      ...

以下是输出:

日志 - 答:req.body.article

{ title: 'article title',
  description: 'about section',
  body: 'Article body',
  tagList: [],
  loc: '{"type":"Point","coordinates":[38.9173025,-77.220978]}' 
}

日志B:使用var article = new Article(req.body.article)创建的文章;

{ loc: { coordinates: [] },
  favoritesCount: 0,
  comments: [],
  tagList: [],
  _id: 5a384f502c9912312c6dd89d,
  body: 'Article body',
  description: 'about section',
  title: 'article title' 
}

我的问题是,当创建对象“文章”时,loc字段开始“{coordinates:[]}”而不是{“type”:“Point”,“coordinates”:[38.9173025,-77.220978]}。

为什么位置数据不在Object中?

我一直在寻找这个问题:Location in mongoose, mongoDB

答案

感谢@Veeram:问题是我的POST请求:该位置是以字符串而不是对象的形式发送的:

在我的Angular前端:

article.model.ts之前

export class Article {
  ....
  loc: string
  ....
}

article.model.ts后

class Location {
  constructor(
    public type: string,
    public coordinates: Array<number> = []
  ){}
}

export class Article {
  ....
  loc: Location
  ....
}

以上是关于无法使用位置字段创建Mongoose对象的主要内容,如果未能解决你的问题,请参考以下文章

无法使用位置字段创建Mongoose对象

Mongoose - 无法使用“findOrCreate”创建超过 4 个字段

在使用 Mongoose 创建对象之前检查唯一字段

创建新模式对象后,Mongoose 引用的字段丢失

无法向 Mongoose 查询返回的对象添加新属性 [重复]

无法向 Mongoose 查询返回的对象添加新属性 [重复]