【问题标题】:How to set up Mongoose schema to store an array of objects in MongoDB?如何设置 Mongoose 模式以在 MongoDB 中存储对象数组?
【发布时间】:2016-05-27 03:43:52
【问题描述】:

我目前有一个array,其中包含多个嵌套在其中的objects

这是格式...

[ { 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 格式的字符串?您是否在内存中创建了此对象?这是其他功能的结果吗?那么当然你打算为存储做什么?这些是单独的文件吗?这些不是包含在单个文档中的数组的成员吗?您是否甚至意识到“架构”是指文档中定义的字段的标准结构。这里提出了这么多问题,而您似乎只看了一眼文档。

标签: node.js mongodb mongoose schema


【解决方案1】:

我建议像这样设置您的架构:

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 创建新的 Schedule 之前,您可能需要输入如下一行:

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

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

【讨论】:

  • 嘿。感谢您的答复。在花时间查看 Mongoose 文档之后,您的第一个解决方案就是我所追求的。不幸的是,这并没有奏效。您的其他解决方案也不起作用,因为并非数组中的所有对象都具有相同的属性。这就是我首先选择Mixed 模式的原因。真是令人难以置信……
  • 啊哈!好的,所以到目前为止我使用的所有模型基本上都是完全有效的。你提供的一切也是有效的。我遇到的问题实际上是在我的服务器端控制器中...... var new_schedule = new Schedule(req.body.info); 注意到有什么可疑的吗?创建新计划时,我没有包含 schedule 键。我应该看起来像这样...... var new_schedule = new Schedule({schedule: req.body.info}); 不过,你明白了为我的模型问题提供正确答案的意义。谢谢!
  • 嗯,我们走了。很高兴我的回答有帮助。这就是我建议使用 console.log 的原因 - 它准确地向您展示了您正在使用的内容。
【解决方案2】:
  1. 在架构中创建内联对象的模型。
  2. 使用这个:

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

【讨论】:

    猜你喜欢
    • 2019-05-29
    • 2022-12-20
    • 2016-05-21
    • 2017-09-30
    • 2021-07-26
    • 1970-01-01
    • 2014-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多