Mongoose 中的虚拟属性详解:让你不必存储冗余数据

在使用 Node.js 的 MongoDB 语言驱动程序 Mongoose 时,有时会需要在 MongoDB 中创建一些虚拟属性。这些属性不会实际存储在数据库中,而是从其他属性中生成。这样可以减少存储空间,提高数据访问速度,以及其他一些更高级的特性。

在本文中,我们将讨论 Mongoose 中的虚拟属性,以及如何使用它们来管理 MongoDB 数据库。

什么是虚拟属性?

虚拟属性是指不会被存储在数据库中的属性,它们是从现有属性中计算得到的,因此它们不需要占用额外的存储空间。尽管没有在数据库中直接存储,但在读取文档时,虚拟属性会根据定义进行计算。

虚拟属性可以实现很多有用的功能,例如:

  • 在响应 JSON 请求时,只返回需要的数据,而不是整个文档。
  • 提供一个更实用的接口,屏蔽了实现细节。
  • 将与某个属性相关的多个值组合在一起。
  • 进行一些计算操作,如计算某个属性的平均值、总和等。

在 Mongoose 中创建虚拟属性

在 Mongoose 中创建虚拟属性非常简单。只需在 Schema 中使用 virtual() 方法并传递虚拟属性的名称即可。

const mongoose = require('mongoose');

const bookSchema = new mongoose.Schema({
  title: String,
  isbn: String,
  author: String,
  category: String
});

bookSchema.virtual('fullTitle').get(function() {
  return this.title + ' (' + this.isbn + ')';
});

在上面的代码中,我们定义了一个虚拟属性 fullTitle,它返回图书的标题和 ISBN 号。在创建虚拟属性时,需要使用 virtual() 方法并传递新属性的名称。在上面的示例中,虚拟属性的名称是 fullTitle。接下来,我们定义了一个 getter 函数,该函数返回一个表示 fullTitle 的字符串。

请注意,在 getter 函数内部,我们可以使用 this 关键字访问文档的其他属性。这样,我们就可以根据文档中的其他属性来计算虚拟属性的值。

使用虚拟属性

创建了虚拟属性后,我们可以像使用其他属性一样使用它。例如,在获取图书列表时,我们可以按以下方式访问虚拟属性:

app.get('/books', function(req, res) {
  bookModel.find(function(err, books) {
    if (err) {
      return res.status(500).json(err);
    }

    const formattedBooks = books.map(function(book) {
      return {
        title: book.title,
        fullTitle: book.fullTitle
      };
    });

    res.json(formattedBooks);
  });
});

在上面的代码中,我们使用 .map() 方法对书籍列表进行转换,以便只返回所需属性。在转换过程中,我们可以像使用其他属性一样使用虚拟属性 fullTitle

总结

在本文中,我们介绍了 Mongoose 中的虚拟属性,并讨论了如何使用它们来管理 MongoDB 数据库。

虚拟属性可以提供许多重要的好处,如减少存储空间、提高数据访问速度,以及屏蔽实现细节等。

在 Mongoose 中创建虚拟属性非常容易,只需使用 virtual() 方法并传递虚拟属性的名称即可。

最后,我们使用虚拟属性来过滤不需要的属性,并证明它们是如何有效地加强代码的模块化、可维护性和可扩展性的。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65965047eb4cecbf2da26256


纠错反馈