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

Posted

技术标签:

【中文标题】如何设置 Mongoose 模式以在 MongoDB 中存储对象数组?【英文标题】:How to set up Mongoose schema to store an array of objects in 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 格式的字符串?您是否在内存中创建了此对象?这是其他功能的结果吗?那么当然你打算为存储做什么?这些是单独的文件吗?这些不是包含在单个文档中的数组的成员吗?您是否甚至意识到“架构”是指文档中定义的字段的标准结构。这里提出了这么多问题,而您似乎只看了一眼文档。 【参考方案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】:
    在架构中创建内联对象的模型。

    使用这个:

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

【讨论】:

以上是关于如何设置 Mongoose 模式以在 MongoDB 中存储对象数组?的主要内容,如果未能解决你的问题,请参考以下文章

设置 Mongoose 模式进行身份验证后,如何使用 Mongodb 查询数据库?

Mongoose 模式:如何设置数组中的最大项目数?

基于其他字段的 Mongoose 验证 [重复]

如何使用 vscode 设置 jest typescript 测试以在调试模式下运行

node中mongodb数据库的使用(下载使用mongoose包)及mongodb数据库的常用命令

如何在@nestjs/mongoose 模式中设置枚举