mongoose会过滤掉额外的属性吗?

时间:2017-04-27 11:01:00

标签: node.js mongodb mongoose

我即将开发一款新应用。我们决定使用mongo作为我们的数据库进行快速原型制作以及猫鼬对于一个orm。我的问题是,在宣布一个新模型之后。当我尝试保存新模型时,它会过滤掉额外的密钥吗?例如。假设一个模型有一个属性name。模型会忽略额外的键吗?

let user = new User({
  name:"bob",
  randomKey: ""
}); 

user.save();

原因是因为我希望能够在快速控制器中执行此操作。

let user = new User({ ...req.body});
user.save();

或者在架构有很多道具的情况下。

3 个答案:

答案 0 :(得分:1)

是的,mongoose不会保存架构定义中不存在的字段。

学生架构: -

var Student = mongoose.model('Student', { name: String, event : String });

发布请求: -

{
    "name" : "extra fields",
    "event" : "from postman",
    "event2" : "not on schema"
}

<强>收集: -

尚未保存event2属性(不属于学生架构)。

{
    "_id" : ObjectId("5901d1d830fa36f020e88ea7"),
    "name" : "extra fields",
    "event" : "from postman",
    "__v" : 0
}

Mongoose schema save issue

答案 1 :(得分:0)

Mongoose不会保存模式中不存在的任何字段,您需要定义类似的模式 -

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var productSchema = new Schema({
    title: String,
    author: String
});

module.exports = mongoose.model('Product', productSchema);

保存产品

var newProduct = new Product();

// set the user's local credentials
newProduct.title  = title;
newProduct.author = author;
newProduct.addintionalData = 'RandomData'; //wont save this data

newProduct.save();

答案 2 :(得分:0)

这是v4.13.19中的重大更改。 (至少从v4.13.19版开始)

您现在只能-

  1. 保存模式中描述的字段(strict:true)
  2. 或者设置strict:false,并允许保存任何内容。

https://github.com/Automattic/mongoose/issues/4801