Nodejs kết nối với mongoose MongoDB

MongoDB chắc chắn là một trong những lựa chọn cơ sở dữ liệu NoSQL phổ biến nhất hiện nay. Và nó có một cộng đồng và hệ sinh thái tuyệt vời

Trong bài viết này, chúng tôi sẽ xem xét một số phương pháp hay nhất để tuân theo khi bạn thiết lập MongoDB và Mongoose với Node. js

Điều kiện tiên quyết cho bài viết này

Bài viết này là một trong lộ trình học tập phụ trợ của codedamn, nơi chúng tôi bắt đầu từ những điều cơ bản về phụ trợ và trình bày chi tiết về chúng. Vì vậy, tôi cho rằng bạn có một số kinh nghiệm với JavaScript (và Node. js) rồi

Hiện tại chúng tôi đang ở đây

Nodejs kết nối với mongoose MongoDB

Nếu bạn có rất ít kinh nghiệm với Node. js/JavaScript hoặc phần cuối nói chung, đây có lẽ là một nơi tốt để bắt đầu. Bạn cũng có thể tìm khóa học miễn phí về Mongoose + MongoDB + Node. js ở đây. Hãy đi sâu vào

Tại sao bạn cần Mongoose?

Để hiểu tại sao chúng ta cần Mongoose, hãy hiểu cách MongoDB (và cơ sở dữ liệu) hoạt động ở cấp độ kiến ​​trúc

  • Bạn có một máy chủ cơ sở dữ liệu (ví dụ: máy chủ cộng đồng MongoDB)
  • Bạn có một nút. js đang chạy (như một tiến trình)

Máy chủ MongoDB lắng nghe trên ổ cắm TCP (thường) và Nút của bạn. js có thể kết nối với nó bằng kết nối TCP

Nhưng ngoài TCP, MongoDB cũng có giao thức riêng để hiểu chính xác ứng dụng khách là gì (Nút của chúng tôi. js) muốn cơ sở dữ liệu thực hiện

Đối với giao tiếp này, thay vì tìm hiểu các thông báo chúng tôi phải gửi trên lớp TCP, chúng tôi trừu tượng hóa điều đó với sự trợ giúp của phần mềm "trình điều khiển", được gọi là trình điều khiển MongoDB trong trường hợp này. Trình điều khiển MongoDB có sẵn dưới dạng gói npm tại đây

Bây giờ hãy nhớ rằng, trình điều khiển MongoDB chịu trách nhiệm kết nối và tóm tắt các yêu cầu/phản hồi giao tiếp cấp thấp từ bạn – nhưng điều này chỉ giúp bạn tiến xa hơn với tư cách là một nhà phát triển

Bởi vì MongoDB là một cơ sở dữ liệu không lược đồ, nên nó cung cấp cho bạn nhiều sức mạnh hơn mức bạn cần khi mới bắt đầu. Nhiều năng lượng hơn có nghĩa là nhiều diện tích bề mặt hơn để làm sai. Bạn cần giảm diện tích bề mặt của các lỗi và sai sót mà bạn có thể tạo ra trong mã của mình. Bạn cần một cái gì đó nhiều hơn

Gặp Mongoose. Mongoose là một bản tóm tắt đối với trình điều khiển MongoDB gốc (gói npm tôi đã đề cập ở trên)

Nguyên tắc chung với sự trừu tượng (theo cách tôi hiểu) là với mỗi lần trừu tượng, bạn sẽ mất một số sức mạnh hoạt động ở mức độ thấp. Nhưng điều đó không nhất thiết có nghĩa là nó xấu. Đôi khi, nó tăng năng suất gấp 1000 lần+ bởi vì dù sao thì bạn cũng không bao giờ thực sự cần có toàn quyền truy cập vào API cơ bản

Một cách hay để suy nghĩ về nó là về mặt kỹ thuật, bạn tạo một ứng dụng trò chuyện thời gian thực bằng cả C và Python

Ví dụ về Python sẽ dễ dàng và nhanh hơn nhiều đối với bạn với tư cách là nhà phát triển để triển khai với năng suất cao hơn

C có thể hiệu quả hơn, nhưng nó sẽ phải trả giá đắt về năng suất/tốc độ phát triển/lỗi/sự cố. Ngoài ra, phần lớn bạn không cần phải có sức mạnh mà C cung cấp cho bạn để triển khai ổ cắm web

Tương tự, với Mongoose, bạn có thể giới hạn diện tích bề mặt của quyền truy cập API cấp thấp hơn, nhưng mở khóa rất nhiều lợi ích tiềm năng và DX tốt

Cách kết nối Mongoose + MongoDB

Đầu tiên, hãy xem nhanh cách bạn nên kết nối với cơ sở dữ liệu MongoDB của mình vào năm 2020 với Mongoose

mongoose.connect(DB_CONNECTION_STRING, {
	useNewUrlParser: true,
	useUnifiedTopology: true,
	useCreateIndex: true,
	useFindAndModify: false
})

Định dạng kết nối này đảm bảo rằng bạn đang sử dụng Trình phân tích cú pháp URL mới từ Mongoose và bạn không sử dụng bất kỳ phương pháp nào không được chấp nhận. Bạn có thể đọc chi tiết về tất cả các thông báo không dùng nữa tại đây nếu muốn

Cách thực hiện thao tác Mongoose

Bây giờ chúng ta hãy tiếp tục và nhanh chóng thảo luận về các hoạt động với Mongoose và cách bạn nên thực hiện chúng

Mongoose cung cấp cho bạn các tùy chọn cho hai điều

  1. Truy vấn dựa trên con trỏ
  2. Truy vấn tìm nạp đầy đủ

Truy vấn dựa trên con trỏ

Truy vấn dựa trên con trỏ có nghĩa là bạn làm việc với một bản ghi tại một thời điểm trong khi bạn tìm nạp một hoặc một nhóm tài liệu tại một thời điểm từ cơ sở dữ liệu. Đây là một cách hiệu quả để làm việc với lượng dữ liệu khổng lồ trong môi trường bộ nhớ hạn chế

Hãy tưởng tượng rằng bạn phải phân tích các tài liệu có tổng dung lượng 10GB trên máy chủ đám mây 1GB/1core. Bạn không thể tìm nạp toàn bộ bộ sưu tập vì bộ sưu tập đó sẽ không vừa với hệ thống của bạn. Con trỏ là một lựa chọn tốt (và duy nhất?) Ở đây

Truy vấn tìm nạp đầy đủ

Đây là loại truy vấn mà bạn nhận được toàn bộ phản hồi cho truy vấn của mình cùng một lúc. Đối với hầu hết các phần, đây là những gì bạn sẽ sử dụng. Do đó, chúng tôi sẽ tập trung chủ yếu vào phương pháp này ở đây

Cách sử dụng Mô hình Mongoose

Các mô hình là siêu năng lực của Mongoose. Chúng giúp bạn thực thi các quy tắc "lược đồ" và cung cấp sự tích hợp liền mạch mã Nút của bạn vào các lệnh gọi cơ sở dữ liệu

Bước đầu tiên là xác định một mô hình tốt

import mongoose from 'mongoose'

const CompletedSchema = new mongoose.Schema(
	{
		type: { type: String, enum: ['course', 'classroom'], required: true },
		parentslug: { type: String, required: true },
		slug: { type: String, required: true },
		userid: { type: String, required: true }
	},
	{ collection: 'completed' }
)

CompletedSchema.index({ slug: 1, userid: 1 }, { unique: true })

const model = mongoose.model('Completed', CompletedSchema)
export default model

Đây là một ví dụ được rút gọn trực tiếp từ codebase của codedamn. Một vài điều thú vị bạn nên lưu ý ở đây

  1. Cố gắng giữ required: true trên tất cả các trường được yêu cầu. Đây có thể là một công cụ tiết kiệm rất nhiều cho bạn nếu bạn không sử dụng hệ thống kiểm tra kiểu tĩnh như TypeScript để hỗ trợ bạn đặt tên thuộc tính chính xác trong khi tạo đối tượng. Ngoài ra, xác thực miễn phí cũng rất tuyệt
  2. Xác định các chỉ mục và các trường duy nhất. Thuộc tính unique cũng có thể được thêm vào trong lược đồ. Chỉ mục là một chủ đề rộng, vì vậy tôi sẽ không đi sâu vào đây. Nhưng trên quy mô lớn, chúng thực sự có thể giúp bạn tăng tốc các truy vấn của mình lên rất nhiều
  3. Xác định tên bộ sưu tập một cách rõ ràng. Mặc dù Mongoose có thể tự động đặt tên bộ sưu tập dựa trên tên của mô hình (ví dụ: ____21_______ ở đây), theo ý kiến ​​​​của tôi, đây là cách quá trừu tượng. Ít nhất bạn nên biết về tên cơ sở dữ liệu và bộ sưu tập trong cơ sở mã của mình
  4. Hạn chế các giá trị nếu bạn có thể, sử dụng enums

Cách thực hiện các hoạt động CRUD

CRUD có nghĩa là Tạo, Đọc, Cập nhật và Xóa. Đây là bốn tùy chọn cơ bản mà bạn có thể thực hiện bất kỳ loại thao tác dữ liệu nào trong cơ sở dữ liệu. Hãy nhanh chóng xem một số ví dụ về các hoạt động này

Thao tác tạo

Điều này đơn giản có nghĩa là tạo một bản ghi mới trong cơ sở dữ liệu. Hãy sử dụng mô hình chúng tôi đã xác định ở trên để tạo một bản ghi

try {
    const res = await CompletedSchema.create(record)
} catch(error) {
	console.error(error)
    // handle the error
}

Một lần nữa, một vài gợi ý ở đây

  1. Sử dụng async-await thay vì gọi lại (đẹp mắt, không mang lại lợi ích hiệu suất đột phá nào như vậy)
  2. Sử dụng các khối thử bắt xung quanh các truy vấn vì truy vấn của bạn có thể không thành công vì một số lý do (bản ghi trùng lặp, giá trị không chính xác, v.v.)

Thao tác đọc

Điều này có nghĩa là đọc các giá trị hiện có từ cơ sở dữ liệu. Nghe có vẻ đơn giản, nhưng có một số vấn đề bạn nên biết với Mongoose

const res = await CompletedSchema.find(info).lean()
  1. Bạn có thể thấy lệnh gọi hàm
    import mongoose from 'mongoose'
    
    const CompletedSchema = new mongoose.Schema(
    	{
    		type: { type: String, enum: ['course', 'classroom'], required: true },
    		parentslug: { type: String, required: true },
    		slug: { type: String, required: true },
    		userid: { type: String, required: true }
    	},
    	{ collection: 'completed' }
    )
    
    CompletedSchema.index({ slug: 1, userid: 1 }, { unique: true })
    
    const model = mongoose.model('Completed', CompletedSchema)
    export default model
    
    0 ở đó không? . Theo mặc định, Mongoose xử lý (các) tài liệu được trả về từ cơ sở dữ liệu và thêm các phương thức ma thuật của nó vào đó (ví dụ:
    import mongoose from 'mongoose'
    
    const CompletedSchema = new mongoose.Schema(
    	{
    		type: { type: String, enum: ['course', 'classroom'], required: true },
    		parentslug: { type: String, required: true },
    		slug: { type: String, required: true },
    		userid: { type: String, required: true }
    	},
    	{ collection: 'completed' }
    )
    
    CompletedSchema.index({ slug: 1, userid: 1 }, { unique: true })
    
    const model = mongoose.model('Completed', CompletedSchema)
    export default model
    
    1)
  2. Khi bạn sử dụng
    import mongoose from 'mongoose'
    
    const CompletedSchema = new mongoose.Schema(
    	{
    		type: { type: String, enum: ['course', 'classroom'], required: true },
    		parentslug: { type: String, required: true },
    		slug: { type: String, required: true },
    		userid: { type: String, required: true }
    	},
    	{ collection: 'completed' }
    )
    
    CompletedSchema.index({ slug: 1, userid: 1 }, { unique: true })
    
    const model = mongoose.model('Completed', CompletedSchema)
    export default model
    
    2, Mongoose trả về các đối tượng JSON đơn giản thay vì các tài liệu nặng về bộ nhớ và tài nguyên. Làm cho các truy vấn nhanh hơn và ít tốn kém hơn trên CPU của bạn
  3. Tuy nhiên, bạn có thể bỏ qua
    import mongoose from 'mongoose'
    
    const CompletedSchema = new mongoose.Schema(
    	{
    		type: { type: String, enum: ['course', 'classroom'], required: true },
    		parentslug: { type: String, required: true },
    		slug: { type: String, required: true },
    		userid: { type: String, required: true }
    	},
    	{ collection: 'completed' }
    )
    
    CompletedSchema.index({ slug: 1, userid: 1 }, { unique: true })
    
    const model = mongoose.model('Completed', CompletedSchema)
    export default model
    
    2 nếu bạn thực sự đang nghĩ đến việc cập nhật dữ liệu (chúng ta sẽ thấy điều đó tiếp theo)

Thao tác cập nhật

Nếu bạn đã có tài liệu Mongoose bên mình (không kích hoạt bằng

import mongoose from 'mongoose'

const CompletedSchema = new mongoose.Schema(
	{
		type: { type: String, enum: ['course', 'classroom'], required: true },
		parentslug: { type: String, required: true },
		slug: { type: String, required: true },
		userid: { type: String, required: true }
	},
	{ collection: 'completed' }
)

CompletedSchema.index({ slug: 1, userid: 1 }, { unique: true })

const model = mongoose.model('Completed', CompletedSchema)
export default model
2), bạn có thể chỉ cần tiếp tục và sửa đổi thuộc tính đối tượng và lưu nó bằng cách sử dụng
import mongoose from 'mongoose'

const CompletedSchema = new mongoose.Schema(
	{
		type: { type: String, enum: ['course', 'classroom'], required: true },
		parentslug: { type: String, required: true },
		slug: { type: String, required: true },
		userid: { type: String, required: true }
	},
	{ collection: 'completed' }
)

CompletedSchema.index({ slug: 1, userid: 1 }, { unique: true })

const model = mongoose.model('Completed', CompletedSchema)
export default model
5

const doc = await CompletedSchema.findOne(info)
doc.slug = 'something-else'
await doc.save()

Hãy nhớ rằng ở đây, có hai cuộc gọi cơ sở dữ liệu được thực hiện. Cái đầu tiên là vào ngày

import mongoose from 'mongoose'

const CompletedSchema = new mongoose.Schema(
	{
		type: { type: String, enum: ['course', 'classroom'], required: true },
		parentslug: { type: String, required: true },
		slug: { type: String, required: true },
		userid: { type: String, required: true }
	},
	{ collection: 'completed' }
)

CompletedSchema.index({ slug: 1, userid: 1 }, { unique: true })

const model = mongoose.model('Completed', CompletedSchema)
export default model
6 và cái thứ hai là vào ngày
import mongoose from 'mongoose'

const CompletedSchema = new mongoose.Schema(
	{
		type: { type: String, enum: ['course', 'classroom'], required: true },
		parentslug: { type: String, required: true },
		slug: { type: String, required: true },
		userid: { type: String, required: true }
	},
	{ collection: 'completed' }
)

CompletedSchema.index({ slug: 1, userid: 1 }, { unique: true })

const model = mongoose.model('Completed', CompletedSchema)
export default model
7

Nếu có thể, bạn phải luôn giảm số lượng yêu cầu truy cập vào cơ sở dữ liệu (vì nếu bạn đang so sánh bộ nhớ, mạng và đĩa, thì mạng hầu như luôn chậm nhất)

Trong trường hợp khác, bạn có thể sử dụng truy vấn như thế này

const res = await CompletedSchema.updateOne(<condition>, <query>).lean()

và nó sẽ chỉ thực hiện một cuộc gọi đến cơ sở dữ liệu

Thao tác xóa

Xóa cũng đơn giản với Mongoose. Hãy xem cách bạn có thể xóa một tài liệu

const res = await CompletedSchema.deleteOne(<condition>)

Cũng giống như

import mongoose from 'mongoose'

const CompletedSchema = new mongoose.Schema(
	{
		type: { type: String, enum: ['course', 'classroom'], required: true },
		parentslug: { type: String, required: true },
		slug: { type: String, required: true },
		userid: { type: String, required: true }
	},
	{ collection: 'completed' }
)

CompletedSchema.index({ slug: 1, userid: 1 }, { unique: true })

const model = mongoose.model('Completed', CompletedSchema)
export default model
8,
import mongoose from 'mongoose'

const CompletedSchema = new mongoose.Schema(
	{
		type: { type: String, enum: ['course', 'classroom'], required: true },
		parentslug: { type: String, required: true },
		slug: { type: String, required: true },
		userid: { type: String, required: true }
	},
	{ collection: 'completed' }
)

CompletedSchema.index({ slug: 1, userid: 1 }, { unique: true })

const model = mongoose.model('Completed', CompletedSchema)
export default model
9 cũng chấp nhận đối số đầu tiên làm điều kiện khớp cho tài liệu

Ngoài ra còn có một phương pháp khác gọi là

try {
    const res = await CompletedSchema.create(record)
} catch(error) {
	console.error(error)
    // handle the error
}
0 chỉ nên được sử dụng khi bạn biết mình muốn xóa nhiều tài liệu

Trong bất kỳ trường hợp nào khác, hãy luôn sử dụng

import mongoose from 'mongoose'

const CompletedSchema = new mongoose.Schema(
	{
		type: { type: String, enum: ['course', 'classroom'], required: true },
		parentslug: { type: String, required: true },
		slug: { type: String, required: true },
		userid: { type: String, required: true }
	},
	{ collection: 'completed' }
)

CompletedSchema.index({ slug: 1, userid: 1 }, { unique: true })

const model = mongoose.model('Completed', CompletedSchema)
export default model
9 để tránh vô tình xóa nhiều lần, đặc biệt khi bạn đang cố gắng tự mình thực hiện các truy vấn

Phần kết luận

Bài viết này là phần giới thiệu đơn giản về thế giới Mongoose và MongoDB cho Node. nhà phát triển js

Nếu bạn thích bài viết này, bạn có thể đẩy mạnh trò chơi của mình hơn nữa với tư cách là nhà phát triển bằng cách làm theo lộ trình học tập phụ trợ codedamn. Vui lòng liên hệ với tôi trên Twitter nếu có bất kỳ phản hồi nào

QUẢNG CÁO

QUẢNG CÁO

QUẢNG CÁO

QUẢNG CÁO

QUẢNG CÁO

QUẢNG CÁO

QUẢNG CÁO

QUẢNG CÁO


Nodejs kết nối với mongoose MongoDB
Mehul Mohan

Nhà phát triển độc lập, người đam mê kỹ thuật bảo mật, thích xây dựng và phá vỡ mọi thứ bằng mã và JavaScript <3


Nếu bạn đọc đến đây, hãy tweet cho tác giả để cho họ thấy bạn quan tâm. Tweet một lời cảm ơn

Học cách viết mã miễn phí. Chương trình giảng dạy mã nguồn mở của freeCodeCamp đã giúp hơn 40.000 người có được việc làm với tư cách là nhà phát triển. Bắt đầu

Làm cách nào để kết nối với MongoDB trong Nodejs bằng cầy mangut?

Bạn có thể kết nối với MongoDB bằng mongoose. phương thức connect() . cầy mangut. kết nối ('mongodb. //127. 0. 0. 1. 27017/myapp'); . Nếu kết nối không thành công trên máy của bạn, hãy thử sử dụng 127. 0. 0. 1 thay vì máy chủ cục bộ.

Làm cách nào để kết nối MongoDB trong nodejs?

js cho MongoDB, chúng ta phải sử dụng thư viện có tên là Mongoose . cầy mangut. kết nối ("mongodb. //máy chủ cục bộ. 27017/collectionName", { useNewUrlParser. đúng, sử dụngUnifiedTopology. ĐÚNG VẬY }); .

Làm cách nào để kết nối MongoDB Compass với Node js?

Cách tiếp cận. - .
Đầu tiên, khởi tạo nút. js trong thư mục cụ thể trong máy của bạn
cài đặt các mô-đun nút trong thư mục dự án
Sau đó, tạo một kết nối đến cơ sở dữ liệu

Làm cách nào để kết nối MongoDB với Node js trong Mã VS?

Để kết nối với cơ sở dữ liệu MongoDB, chọn Thêm kết nối và nhập chi tiết kết nối cho cơ sở dữ liệu rồi chọn Kết nối , mặc định là MongoDB cục bộ . //127. 0. 0. 1. 27017. Bạn cũng có thể nhập chuỗi kết nối, nhấp vào liên kết "kết nối với chuỗi kết nối" và dán chuỗi kết nối.