MongoDB Mongoose:不将 _id 放在嵌入文档中

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 属性。祝你在开发过程中取得成功!

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程