我想将数据保存在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
}
如果需要其他详细信息,请告诉我。
答案 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。