如何设置Mongoose模式以在MongoDB中存储对象数组?

3

我目前有一个包含多个嵌套在其中的对象的数组

格式如下...

[ { id: 1, title: 'Squats', video: 'https://www.youtube.com/watch?v=aPYCiuiB4PA' }, { id: 2, title: 'Push-Ups',video: 'https://www.youtube.com/watch?v=aPYCiuiB4PA' }]

我试图在类似这样的Schedule模型中使用.save()方法保存它...

var ScheduleSchema = new mongoose.Schema({
    schedule: [Object]
})

当我在服务器端的Schedule控制器中运行以下代码时,.save()函数会给我一个“成功”的消息(我程序化它给出),但是当我查看MongoDB数据库时,它保存不正确,并且schedule数组中没有任何内容。 以下是保存在数据库中的信息....
{ "_id" : ObjectId("56c28a0d4c92bec03408c077"), "schedule" : [ ], "__v" : 0 }

我有一种感觉,我的模型设置错误了。

我尝试过的模型架构...

1)schedule: []
2)schedule: [Schema.Types.Mixed]

如果有帮助的话,在保存来自计划控制器的数据时,这是我的 .save() 函数...

var new_schedule = new Schedule(req.body.info);
new_schedule.save(function(err){
    if(err){
        console.log('err');
    }else{
        console.log('worked');
    }
})

你的意图非常不清楚。 *"我有一个包含多个对象的数组.."*。好的,它在哪里?它是作为JSON格式的字符串在文本文件中吗?您是否在内存中创建了此对象?这是某些其他函数的结果吗?然后当然,您打算如何进行存储?这些是单独的文档吗?这些是否是包含在单个文档中的数组成员?您是否知道“模式”指的是定义在文档中的字段的标准结构。这里提出了很多问题,而您似乎只是匆匆浏览了文档。 - Blakes Seven
2个回答

9
我建议按照以下方式设置模式:

我建议按照以下方式设置模式:

var ScheduleSchema = new mongoose.Schema({
    schedule: [mongoose.Schema.Types.Mixed]
});

这是正确的设置方法。另一种方法是内联定义对象,像这样:

var ScheduleSchema = new mongoose.Schema({
    schedule: [{
        id: { type: Number, default: 1 },
        title: { type: String, default: '', trim: true },
        video: { type: String, default: '', trim: true }
    }]
});

另外,这可能不是服务器端代码的问题。在使用req.body.info创建新计划之前,您可能需要添加以下一行代码:

console.log(JSON.stringify(req.body, null, 2));

这将以易读的格式打印出req.body对象,以便您确认客户端应用程序发送了您认为正在获取的信息。

嗨,谢谢你的回复。在花时间查看Mongoose文档后,我选择了你的第一个解决方案。不幸的是,它并没有起作用。你的另一个解决方案也不起作用,因为数组中并不是所有对象都具有相同的属性。这就是我一开始选择“混合”模式的原因。这真是令人费解... - Erik Åsland
啊哈!好的,基本上我迄今使用的所有模型都是完全有效的。你提供的一切也都是有效的。我遇到的问题实际上是在我的服务器端控制器中...... var new_schedule = new Schedule(req.body.info); 注意到什么可疑的地方了吗? 我没有在创建新的Schedule时包含schedule键。它应该看起来像这样... var new_schedule = new Schedule({schedule: req.body.info}); 不过,你提供了正确答案来回答我的模型问题。谢谢! - Erik Åsland
啊,好的,我们完成了。很高兴我的回答有所帮助。这就是我建议使用console.log的原因——它可以准确地显示你正在处理的内容。 - tutley

1
  1. Make a model of inline objects in schema.
  2. Use this :

    var model = mongoose.model("CollectionName",SchemaName);
    model.insertMany(arrayOfSchedules , function(err,docs){});
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接