Mongoose cho MongoDB, Nodejs

Chúng tôi vui mừng chia sẻ kiến thức về từ khóa Mongoose la gi và hy vọng rằng nó sẽ hữu ích cho bạn đọc. Bài viết tập trung trình bày ý nghĩa, vai trò và ứng dụng của từ khóa này trong việc tối ưu hóa nội dung trang web và chiến dịch tiếp thị trực tuyến. Chúng tôi cung cấp các phương pháp tìm kiếm, phân tích và lựa chọn từ khóa phù hợp, cùng với các chiến lược và công cụ hữu ích. Hy vọng rằng thông tin mà chúng tôi chia sẻ sẽ giúp bạn xây dựng chiến lược thành công và thu hút lưu lượng người dùng. Xin chân thành cảm ơn sự quan tâm và hãy tiếp tục theo dõi blog của chúng tôi để cập nhật những kiến thức mới nhất.

Mongoose là một thư viện mô hình hóa đối tượng người tiêu dùng (Object Data Model – ODM) cho MongoDB và Node.js. Nó quản lý quan hệ giữa tài liệu, cung cấp sự xác nhận giản đồ và được sử dụng để dịch giữa các đối tượng người tiêu dùng trong mã và trình diễn các đối tượng người tiêu dùng trong MongoDB.

Bạn Đang Xem: Mongoose cho MongoDB, Nodejs

MongoDB là một cơ sở tài liệu NoSQL. Bạn cũng có thể lưu trữ các JSON trong đó, và cấu trúc của rất nhiều tài liệu này còn có thể thay đổi vì nó không bắt buộc như các cơ sở tài liệu SQL. Đây là một trong những lợi thế của việc sử dụng NoSQL vì nó tăng tốc độ phát triển ứng dụng và giảm sự phức tạp của việc triển khai.

Sau đây là ví dụ về kiểu cách tài liệu được lưu giữ trong cơ sở tài liệu Mongo vs. SQL:

Thuật ngữ – Terminologies

Collections

Collections ở Mongo tương đương với những bảng trong các cơ sở tài liệu quan hệ. Chúng có thể chứa nhiều tài liệu JSON.

Documents

‘Documents’ tương đương với những bản ghi trong SQL. Mặc dù một dòng SQL có thể tham khảo tài liệu trong các bảng khác, các tài liệu Mongo thường phối hợp trong một tài liệu.

Fields

‘Fields’ tính chất tương tự như các cột trong một bảng SQL.

Schema

Trong những lúc Mongo là schema-less, SQL khái niệm một sơ đồ thông qua khái niệm bảng. Một sơ đồ Mongoose là một lớp cấu trúc tài liệu được thi hành qua lớp ứng dụng.

Fields

‘Models’ là mô hình bậc cao có một sơ đồ và tạo ra một thể hiện của một tài liệu tương đương với những bản ghi trong một cơ sở tài liệu quan hệ.

Tùy chỉnh thiết lập Mongo

Schema Trong những lúc Mongo là schema-less, SQL khái niệm một sơ đồ thông qua khái niệm bảng. Một sơ đồ Mongoose ‘là một cấu trúc tài liệu tài liệu (hoặc hình dạng của tài liệu) được thi hành qua lớp ứng dụng.

Tùy chỉnh thiết lập MongoDB thích hợp cho Hệ điều hành của bạn từ Website MongoDB https://docs.mongodb.com/manual/installation/ và tuân theo hướng dẫn cấu hình thiết lập

  • Tạo đăng ký cơ sở tài liệu sandbox miễn phí trên mLab
  • Tùy chỉnh thiết lập Mongo bằng Docker nếu như khách hàng sử dụng docker Hãy điều phối qua một số vấn đề cơ bản của Mongoose bằng phương pháp triển khai mô hình tài liệu cho một sổ địa chỉ đơn giản.

Tùy chỉnh thiết lập NPM Tất cả chúng ta hãy vào thư mục dự án và khởi tạo dự án của tất cả chúng ta

npm init -y

Tùy chỉnh thiết lập Mongoose và một thư viện xác nhận với lệnh sau:

npm install mongoose validator

Lệnh cấu hình thiết lập trên sẽ cấu hình thiết lập phiên bản tiên tiến nhất của thư viện. Cú pháp Mongoose trong bài báo này đặc trưng cho Mongoose v5 và hơn thế nữa.

Kết nối cơ sở tài liệu Tạo tệp ./src/database.js trong thư mục gốc của dự án.

Tiếp theo, tất cả chúng ta sẽ tạo thêm một một phương thức kết nối với cơ sở tài liệu.

Kết nối sẽ thay đổi tùy theo cấu hình thiết lập của bạn.

let mongoose = require(‘mongoose’); const server = ‘127.0.0.1:27017’; // REPLACE WITH YOUR DB SERVER const database = ‘fcc-Mail’; // REPLACE WITH YOUR DB NAME class Database { constructor() { this._connect() } _connect() { mongoose.connect(`mongodb://${server}/${database}`) .then(() => { console.log(‘Database connection successful’) }) .catch(err => { console.error(‘Database connection error’) }) } } module.exports = new Database()

Lệnh yêu cầu (‘mongoose’) trả về phía trên trả về một đối tượng người tiêu dùng Singleton. Điều này còn có tức là lần trước tiên bạn gọi (“mongoose”), nó tạo ra một lớp Mongoose và trả lại . Trong các cuộc gọi tiếp theo, nó sẽ trả lại cùng một cá thể đã được tạo và trả lại cho bạn lần trước tiên vì cách nhập / xuất mô-đun trong ES6.

Tương tự như vậy, tất cả chúng ta đã chuyển lớp Cơ sở tài liệu của tất cả chúng ta thành một singleton bằng phương pháp trả lại một thể hiện của lớp trong module.exports vì tất cả chúng ta chỉ có một kết nối duy nhất với cơ sở tài liệu.

ES6 làm cho tất cả chúng ta dễ dàng tạo mẫu singleton (ví dụ đơn) vì mô-đun hoạt động ra sao bằng phương pháp lưu trữ các phản hồi của một tệp tin được nhập trước đó.

Mongoose Schema vs. Model

Mongoose model gồm có Mongoose schema. Mongoose schema xác định cấu trúc của tài liệu, các giá trị mặc định, xác nhận. trong những lúc Mongoose model cung cấp một giao diện cho cơ sở tài liệu để tạo, truy vấn, update, xoá các bản ghi.

Tạo ra một mô hình Mongoose model gồm có chủ yếu là ba phần:

  1. Tham khảo Mongoose let mongoose = require(‘mongoose’)

Xem Thêm : Văn bản ngữ văn 7

Tài liệu tham khảo này sẽ giống với tài liệu đã được trả về khi chúng tôi kết nối với cơ sở tài liệu, có tức là sơ đồ và các khái niệm mô hình sẽ không nhất thiết phải kết nối một cách rõ ràng với cơ sở tài liệu.

  1. Xác định Schema Một giản đồ khái niệm tài sản tài sản thông qua một đối tượng người tiêu dùng mà tên khóa tương ứng với tên tính chất trong bộ sưu tập.

let emailSchema = new mongoose.Schema({ email: String })

Ở đây chúng tôi khái niệm một tính chất được gọi là email với một kiểu sơ đồ String ánh xạ tới một trình xác nhận nội bộ sẽ tiến hành kích hoạt khi mô hình được lưu vào cơ sở tài liệu. Nó sẽ thất bại nếu kiểu tài liệu của giá trị không phải là một kiểu chuỗi.

Các Loại schena sau được được chấp nhận:

Array Boolean Buffer Date Mixed (A generic / flexible data type) Number ObjectId String

Hỗn hợp và ObjectId được khái niệm theo yêu cầu (‘mongoose’) Schema.Types.

  1. Xuất mô hình Tất cả chúng ta gọi constructor mô hình trên Mongoose và truyền nó cho tên bộ sưu tập và một tham chiếu đến sơ đồ.

module.exports = mongoose.model(‘E-Mail’, emailSchema)

Tất cả chúng ta hãy phối hợp đoạn mã trên thành ./src/models/email.js để xác định nội dung của một mô hình cơ bản:

let mongoose = require(‘mongoose’) let emailSchema = new mongoose.Schema({ email: String }) module.exports = mongoose.model(‘E-Mail’, emailSchema)

Khái niệm sơ đồ phải đơn giản, nhưng tính phức tạp của nó thường dựa trên yêu cầu ứng dụng. Các sơ đồ có thể được sử dụng lại và chúng cũng đều có thể chứa một số sơ đồ con. Trong ví dụ trên, giá trị của tính chất email là một loại giá trị đơn giản. Tuy nhiên, nó cũng đều có thể là một loại đối tượng người tiêu dùng với những tính chất bổ sung trên đó. Tất cả chúng ta có thể tạo ra một thể hiện của mô hình tất cả chúng ta đã khái niệm ở trên và điền nó bằng phương pháp sử dụng cú pháp sau:

let EmailModel = require(‘./email’) let msg = new EmailModel({ email: ‘ada.lovelace@gmail.com’ })

Hãy nâng cao sơ đồ E-Mail để làm cho tính chất email là một trường bắt buộc, và chuyển đổi giá trị sang chữ thường trước lúc lưu nó. Chúng tôi cũng đều có thể thêm một chức năng xác nhận rằng sẽ đảm nói rằng giá trị là một địa chỉ email hợp thức. Chúng tôi sẽ tham khảo và sử dụng thư viện trình duyệt đã được cấu hình thiết lập trước đó.

let mongoose = require(‘mongoose’) let validator = require(‘validator’) let emailSchema = new mongoose.Schema({ email: { type: String, required: true, unique: true, lowercase: true, validate: (value) => { return validator.isEmail(value) } } }) module.exports = mongoose.model(‘E-Mail’, emailSchema)

Hoạt động cơ bản Mongoose có một API linh hoạt và cung cấp nhiều phương pháp để hoàn thành một nhiệm vụ. Chúng tôi sẽ không còn tập trung vào phần này vì nó nằm ngoài phạm vi của nội dung bài viết, nhưng hãy nhớ rằng hồ hết những hoạt động có thể được thực hiện theo vô số phương pháp bằng cú pháp khác nhau hoặc thông qua kiến trúc ứng dụng.

Create Record

Hãy tạo một thể hiện của mô hình email và lưu nó vào cơ sở tài liệu:

let EmailModel = require(‘./email’) let msg = new EmailModel({ email: ‘ADA.LOVELACE@GMAIL.COM’ }) msg.save() .then(doc => { console.log(doc) }) .catch(err => { console.error(err) })

Kết quả được trả lại khi lưu thành công:

{ _id: 5a78fe3e2f44ba8f85a2409a, email: ‘ada.lovelace@gmail.com’, __v: 0 }

Các trường sau được trả về (Trường nội bộ được đặt trước bằng dấu gạch dưới “_”).

Trường _id được Mongo tạo tự động hóa và là một khóa chính của collection. Giá trị của nó là duy nhất. Giá trị của trường email được trả lại. Lưu ý nó là chữ in thường vì tính chất đúng trong giản đồ lowercase:true __v là tính chất versionKey được đặt trên mỗi tài liệu khi được tạo bởi Mongoose. Giá trị của nó gồm có nội dung tài liệu.

Nếu như khách hàng cố gắng nỗ lực tạo tiếp với dự liệu như trên, các bạn sẽ nhận được một lỗi vì trường email tất cả chúng ta khái niệm là duy nhất.

Fetch Record

Hãy thử lấy lại bản ghi tất cả chúng ta đã lưu vào cơ sở tài liệu trước đó. Lớp mô hình cho thấy một số phương pháp tĩnh và để thực hiện trên cơ sở tài liệu. Thời điểm hiện nay tất cả chúng ta sẽ tìm kiếm hồ sơ mà tất cả chúng ta đã tạo ra trước đó bằng phương pháp sử dụng phương pháp tìm và gửi email dưới dạng cụm từ tìm kiếm.

EmailModel .find({ email: ‘ada.lovelace@gmail.com’ // search query }) .then(doc => { console.log(doc) }) .catch(err => { console.error(err) })

Tài liệu được trả về sẽ giống như những gì được hiển thị khi chúng tôi tạo bản ghi:

{ _id: 5a78fe3e2f44ba8f85a2409a, email: ‘ada.lovelace@gmail.com’, __v: 0 }

Update Bản ghi Hãy sửa đổi bản ghi ở trên bằng phương pháp thay đổi địa chỉ email và thêm một trường vào nó, tất cả trong một thao tác đơn lẻ. Vì lý do hiệu suất, Mongoose sẽ không còn trả lại tài liệu đã update nên tất cả chúng ta cần phải thông qua một thông số bổ sung để yêu cầu nó:

EmailModel .findOneAndUpdate( { email: ‘ada.lovelace@gmail.com’ // search query }, { email: ‘theoutlander@live.com’ // field:values to update }, { new: true, // return updated doc runValidators: true // validate before update }) .then(doc => { console.log(doc) }) .catch(err => { console.error(err) })

Tài liệu trả về sẽ chứa email đã update:

{ _id: 5a78fe3e2f44ba8f85a2409a, email: ‘theoutlander@live.com’, __v: 0 }

Xóa hồ sơ Chúng tôi sẽ sử dụng lệnh findOneAndRemove để xóa một bản ghi. Nó trả về các tài liệu thuở đầu đã được gỡ bỏ:

EmailModel .findOneAndRemove({ email: ‘theoutlander@live.com’ }) .then(response => { console.log(response) }) .catch(err => { console.error(err) })

Người trợ giúp Chúng tôi đã xem xét một số chức năng cơ bản được nghe biết như những hoạt động CRUD (Tạo, Đọc, Update, Xoá), nhưng Mongoose cũng cung cấp khả năng định cấu hình một số loại phương thức trợ giúp và tính chất. Chúng có thể được sử dụng để đơn giản hóa việc thao tác với tài liệu.

Hãy tạo một giản đồ người dùng trong /src/models/user.js với fieldsfirstName và lastName:

let mongoose = require(‘mongoose’) let userSchema = new mongoose.Schema({ firstName: String, lastName: String }) module.exports = mongoose.model(‘User’, userSchema)

Virtual Property Một số tính chất ảo không nhất thiết phải là tồn tại trong cơ sở tài liệu. Tất cả chúng ta có thể thêm nó vào giản đồ của tất cả chúng ta như một người trợ giúp để giành được và thiết lập các giá trị.

Hãy tạo một tính chất ảo gọi là fullName có thể được sử dụng để tại vị các giá trị trên firstName và lastName và lấy chúng như một giá trị phối hợp khi đọc:

Xem Thêm : Tần số Hz là gì? Tất tần tật kiến thức về Hz mà bạn nên biết

userSchema.virtual(‘fullName’).get(function() { return this.firstName + ‘ ‘ + this.lastName }) userSchema.virtual(‘fullName’).set(function(name) { let str = name.split(‘ ‘) this.firstName = str[0] this.lastName = str[1] })

Gọi lại để nhận và đặt phải sử dụng từ khoá chức năng vì tất cả chúng ta cần truy cập vào mô hình thông qua từ khóa này. Sử dụng chức năng mũi tên chất béo sẽ thay đổi điều này đề cập đến.

Thời điểm hiện nay, tất cả chúng ta có thể đặt firstName và lastName bằng phương pháp gán một giá trị cho fullName:

let model = new UserModel() model.fullName = ‘Thomas Anderson’ console.log(model.toJSON()) // Output model fields as JSON console.log() console.log(model.fullName) // Output the full name

Đoạn mã trên sẽ xuất ra những điều sau: { _id: 5a7a4248550ebb9fafd898cf, firstName: ‘Thomas’, lastName: ‘Anderson’ }

Các phương thức Tất cả chúng ta có thể tạo ra các phương thức tuỳ chỉnh trên sơ đồ và truy cập chúng thông qua mô hình mẫu. Những phương pháp này sẽ sở hữu quyền truy cập vào đối tượng người tiêu dùng mô hình và chúng có thể được sử dụng. Ví dụ, tất cả chúng ta có thể tìm tất cả những người dân có cùng tên.

Trong ví dụ này, tất cả chúng ta hãy tạo một hàm để trả lại tên cho tất cả những người dùng ngày nay. Hãy thêm một phương thức helper tùy chỉnh gọi là getInitials vào giản đồ:

userSchema.methods.getInitials = function() { return this.firstName[0] + this.lastName[0] }

Phương pháp này sẽ sở hữu thể truy cập thông qua một mô hình ví dụ:

let model = new UserModel({ firstName: ‘Thomas’, lastName: ‘Anderson’ }) let initials = model.getInitials() console.log(initials) // This will output: TA

Phương pháp tĩnh Tương tự như các phương thức dụ, tất cả chúng ta có thể tạo các phương thức tĩnh trên sơ đồ. Hãy tạo ra một phương pháp để lấy tất từ đầu đến chân dùng trong cơ sở tài liệu:

userSchema.statics.getUsers = function() { return new Promise((resolve, reject) => { this.find((err, docs) => { if(err) { console.error(err) return reject(err) } resolve(docs) }) }) }

Gọi getUsers trên lớp Model sẽ trả lại tất từ đầu đến chân dùng trong cơ sở tài liệu:

UserModel.getUsers() .then(docs => { console.log(docs) }) .catch(err => { console.error(err) })

Thêm dụ và phương pháp tĩnh là một cách tiếp cận tốt đẹp để thực hiện một giao diện tương tác cơ sở tài liệu trên các bộ sưu tập và hồ sơ. Middleware Middleware là các chức năng chạy ở các thời đoạn cụ thể của đường ống dẫn. Mongoose tương trợ trung gian cho những hoạt động sau:

Tổng hợp Tài liệu Mô hình Truy vấn Ví dụ, các mô hình có chức năng trước và sau có hai thông số:

  1. Loại sự kiện (‘init’, ‘validate’, ‘save’, ‘remove’)
  2. Một gọi lại được thực hiện với điều này tham khảo ví dụ mô hình

Hãy thử một ví dụ bằng phương pháp thêm hai trường được gọi là createdAt và updatedAt vào giản đồ của tất cả chúng ta:

let mongoose = require(‘mongoose’) let userSchema = new mongoose.Schema({ firstName: String, lastName: String, createdAt: Date, updatedAt: Date }) module.exports = mongoose.model(‘User’, userSchema)

Khi được gọi là model.save (), có sự kiện pre(‘save’, …) và post(‘save’, …) được kích hoạt. Hãy thêm một Hook trước lúc lưu và đặt các giá trị cho createdAt và updatedAt:

userSchema.pre(‘save’, function (next) { let now = Date.now() this.updatedAt = now // Set a value for createdAt only if it is null if (!this.createdAt) { this.createdAt = now } // Call the next function in the pre-save chain next() })

Hãy tạo và lưu mô hình:

let UserModel = require(‘./user’) let model = new UserModel({ fullName: ‘Thomas Anderson’ } msg.save() .then(doc => { console.log(doc) }) .catch(err => { console.error(err) })

Các bạn sẽ thấy các giá trị cho createdAt và updatedAt khi bản ghi được tạo ra được in:

{ _id: 5a7bbbeebc3b49cb919da675, firstName: ‘Thomas’, lastName: ‘Anderson’, updatedAt: 2018-02-08T02:54:38.888Z, createdAt: 2018-02-08T02:54:38.888Z, __v: 0 }

Giả sử tất cả chúng ta muốn theo dõi khi một bản ghi được tạo ra và update lần cuối trên mỗi bộ sưu tập trong cơ sở tài liệu của chúng tôi. Thay vì tái diễn quá trình trên, tất cả chúng ta có thể tạo một plugin và vận dụng nó cho mọi schema. Hãy tạo tệp ./src/model/plugins/timestamp.js và nhân văn lại chức năng trên dưới dạng mô-đun có thể sử dụng lại được:

module.exports = function timestamp(schema) { // Add the two fields to the schema schema.add({ createdAt: Date, updatedAt: Date }) // Create a pre-save hook schema.pre(‘save’, function (next) { let now = Date.now() this.updatedAt = now // Set a value for createdAt only if it is null if (!this.createdAt) { this.createdAt = now } // Call the next function in the pre-save chain next() }) }

Để sử dụng plugin này, chúng tôi chỉ có truyền nó tới các sơ đồ cần được cung cấp cho chức năng này:

let timestampPlugin = require(‘./plugins/timestamp’) emailSchema.plugin(timestampPlugin) userSchema.plugin(timestampPlugin)

Query Building

Mongoose có một API rất phong phú để xử lý nhiều hoạt động phức tạp được tương trợ bởi MongoDB.

UserModel.find() // find all users .skip(100) // skip the first 100 items .limit(10) // limit to 10 items .sort({firstName: 1} // sort ascending by firstName .select({firstName: true} // select firstName only .exec() // execute the query .then(docs => { console.log(docs) }) .catch(err => { console.error(err) })

Kết luận

Tất cả chúng ta mới chỉ khám phá một số tính năng cơ bản của Mongoose. Đây là một thư viện phong phú đầy đủ các tính năng hữu ích và mạnh mẽ khi thao tác với những mô hình tài liệu trong lớp ứng dụng.

Bạn cũng có thể tương tác trực tiếp với Mongo bằng Mongo Driver, Mongoose sẽ đơn giản hóa tương tác đó bằng phương pháp được chấp nhận bạn mô hình các quan hệ giữa tài liệu và xác nhận chúng một cách dễ dàng.

Link tham khao

https://www.codementor.io/theoutlander/introduction-to-mongoose-for-mongodb-gw9xw34el

http://mongoosejs.com/

https://www.mongodb.com/

You May Also Like

About the Author: v1000