MongoDB Mongoose:不将 _id 放在嵌入文档中
在本文中,我们将介绍MongoDB和Mongoose中的嵌入文档的使用以及问题解决方案。重点是解决Mongoose在嵌入文档中是否自动设置 _id 属性的问题。
阅读更多:MongoDB 教程
什么是嵌入文档?
在MongoDB中,嵌入文档是指将一个文档嵌套在另一个文档中的一种数据模型方式。它允许我们在一个文档中存储其他相关文档的数据,而无需使用引用或关联。
在Mongoose中,我们可以通过定义Schema来创建嵌入文档。Schema是一个数据模型的蓝图,用于定义文档的结构和字段类型。
MongoDB中的嵌入文档
让我们通过一个简单的例子来说明MongoDB中的嵌入文档。
假设我们有一个名为 “books” 的集合,其中存储了多本书籍的信息。每本书都具有标题、作者和出版日期等属性。我们还知道每本书都有一个独一无二的书号,这可以作为一个唯一标识符。
我们可以使用以下结构来表示每本书的信息:
{
"_id": ObjectId("61d34f71c53c0a64ea6f183e"),
"title": "JavaScript高级编程",
"author": "Nicholas C. Zakas",
"publishedDate": ISODate("2021-01-01")
}
Mongoose中的嵌入文档
当使用Mongoose与MongoDB集成时,我们可以通过嵌入文档来创建更复杂的数据模型。
考虑到上述的 “books” 示例,我们可以使用以下Mongoose代码来定义书集合的Schema:
const bookSchema = new mongoose.Schema({
title: String,
author: String,
publishedDate: Date
});
const librarySchema = new mongoose.Schema({
name: String,
books: [bookSchema]
});
在上面的示例中,我们定义了一个名为 “library” 的文档集合,其中包含了图书馆的名称和一个嵌套的 “books” 字段,用于存储所有图书的信息。
Mongoose中的 _id 属性
在Mongoose中,每个文档都会自动分配一个 _id 属性作为其唯一标识符。默认情况下,该属性是以ObjectId的形式生成的。
对于嵌套文档,Mongoose通常会自动为每个嵌套文档生成 _id 属性。但是,有时候我们可能不希望在嵌套文档中生成 _id 属性。这可能是因为我们有自己的唯一标识符或是其他的需求。
解决方案:禁用 _id 属性
在Mongoose中,我们可以通过设置 _id 属性的 “id” 选项来控制嵌套文档中的 _id 属性的生成。
以下是如何在嵌套文档中禁用 _id 属性的示例:
const bookSchema = new mongoose.Schema({
title: String,
author: String,
publishedDate: Date
}, { _id: false });
const librarySchema = new mongoose.Schema({
name: String,
books: [bookSchema]
});
在上面的示例中,我们在定义 “bookSchema” 时将 _id 属性的 “id” 选项设置为 false。这将禁用嵌套文档中的 _id 属性。
现在,当我们在图书馆文档中创建新的嵌套文档时,嵌套文档将不再包含 _id 属性:
{
"_id": ObjectId("61d3508b0adead091e9f1234"),
"name": "ABC 图书馆",
"books": [
{
"title": "JavaScript高级编程",
"author": "Nicholas C. Zakas",
"publishedDate": ISODate("2021-01-01")
},
{
"title": "Python基础教程",
"author": "Mark Lutz",
"publishedDate": ISODate("2021-02-01")
}
]
}
正如我们所见,嵌套文档中的 _id 属性已被省略。
总结
本文介绍了MongoDB和Mongoose中嵌套文档的使用,并解决了Mongoose不将 _id 属性放在嵌套文档中的问题。
通过设置Schema的 “id” 选项为 false,我们可以禁用嵌套文档中的 _id 属性。这在某些特定情况下非常有用,例如当我们有自己的唯一标识符或不需要使用 _id 属性时。
希望本文能够帮助你更好地理解MongoDB和Mongoose中的嵌入文档,并了解如何控制嵌套文档中的 _id 属性。祝你在开发过程中取得成功!
极客教程