【问题标题】:When I do a POST, the data is not saved in MongoDB, only _ID is saved当我做一个 POST 时,数据没有保存在 MongoDB 中,只保存了 _ID
【发布时间】:2019-04-07 11:32:33
【问题描述】:

我想在 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
}

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

【问题讨论】:

    标签: express mongoose


    【解决方案1】:

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

      { any:"xmen"}
    

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

    你会得到预期的结果。

    【讨论】:

      【解决方案2】:

      您遇到这种情况是因为您的 Mongoose 架构不知道它应该存储在文档中的属性。

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

      any 并不意味着任何属性都可以接受。从字面上看,这意味着 Mongoose 正在寻找具有 "any" 键的值。如果您的请求正文不包含这样的键(它不包含,因为它只包含 nameage),则在您保存新对象时不会被拾取.

      您遇到的是 Mongoose 的预期行为。

      定义架构

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

      您可以像这样定义您的架构:

      {
          name: String,
          age: Number
      }
      

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


      阅读更多关于 Mongoose Schemas 的信息here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-02-13
        • 1970-01-01
        • 2017-07-16
        • 2023-03-11
        • 1970-01-01
        • 2020-08-08
        • 2019-08-27
        相关资源
        最近更新 更多