当我执行POST时,数据未保存在MongoDB中,仅保存了_ID

时间:2019-04-06 15:50:38

标签: express mongoose

我想将数据保存在MongoDB中。我使用开放式架构(无限制)。如果我执行POST请求,则仅保存_ID。我没有收到任何错误,但是我传递的数据被忽略了。

我是猫鼬的新手。我阅读了文档,但无法指出我在哪里出错。

我的模式:

var Schema = mongoose.Schema;
var product = new Schema({any: {}});
var Product = mongoose.model('Product',product)

我的POST请求:

app.post('/input',function(request,response) {
    var product = new Product(request.body);    
    product.save(function(err,saved) {
        if (err) {
            response.send({error:"could not save"});
        } else  {
            response.send(saved);
        }
    })
})

MongoDB中保存了什么内容

{
    "_id": "5ca8c6ada7827b6f64c603bf",
    "__v": 0
}

我的输入:

{
    "name":"xmen",
    "age":25
}

如果需要其他详细信息,请告诉我。

2 个答案:

答案 0 :(得分:0)

您正在将request.body传递给构造函数。代码中的request.body是一个具有两个属性的对象:name: "xmen"age: 25。 但是,您的Schema仅包含一个属性:any: {}{}表示您接受任何数据类型)。 当您将request.body传递给var product = new Product(request.body);时,您会将具有2个属性的对象传递给构造函数,该构造函数期望一个拥有一个属性的对象称为any,因此当构造函数找不到该对象时,它将返回仅带有_id的对象。 如果您提供:

  { any:"xmen"}

  {
    any: {
      "name":"xmen",
      "age":25
    }
  }

您将获得预期的结果。

答案 1 :(得分:0)

您正在经历这种情况,因为您的Mongoose模式不知道它应该存储在文档中的属性。

您在架构定义中使用了any作为键,我认为您这样做是因为您遵循了文档中的SchemaTypes部分。

any并不意味着可以接受任何属性。从字面上看,这意味着Mongoose正在使用“ any” 键寻找值。如果您的请求正文不包含此类键(并且它不包含键,因为它仅包含 name age ),则在保存新对象时将不会对其进行提取。

您正在体验的是猫鼬的预期行为。

定义架构

MongoDB的文档结构灵活。但是,在定义新模式时,还必须定义所有可能的属性及其类型(也可以使用{}作为支持任何类型的类型-尽管不建议这样做)。

您可以这样定义模式:

{
    name: String,
    age: Number
}

这意味着当您为新对象调用.save()时,Mongoose将仅选择架构中的指定属性(以及任何架构中存在的_id__v默认情况下。)


详细了解猫鼬模式here