Mongoose هي أداة لنمذجة كائن MongoDB مصممة للعمل في بيئة غير متزامنة. يدعم Mongoose Node.js وDeno (alpha).
موقع التوثيق الرسمي هو mongoosejs.com.
تم إصدار Mongoose 8.0.0 في 31 أكتوبر 2023. يمكنك العثور على مزيد من التفاصيل حول التغييرات العكسية في الإصدار 8.0.0 على موقع المستندات الخاص بنا.
قم بمراجعة موقع البحث عن المكونات الإضافية لرؤية مئات الوحدات ذات الصلة من المجتمع. بعد ذلك، تعرف على كيفية كتابة المكون الإضافي الخاص بك من المستندات أو منشور المدونة هذا.
طلبات السحب مرحب بها دائمًا! يرجى إسناد طلبات السحب إلى الفرع master
واتباع دليل المساهمة.
إذا أدت طلبات السحب الخاصة بك إلى إجراء تغييرات على الوثائق، فيرجى عدم تعديل أي ملفات .html
. ملفات .html
عبارة عن تعليمات برمجية مجمعة، لذا يرجى إجراء تغييراتك في docs/*.pug
أو lib/*.js
أو test/docs/*.js
.
عرض جميع المساهمين الذين يزيد عددهم عن 400+.
قم أولاً بتثبيت Node.js وMongoDB. ثم:
npm install mongoose
يتضمن Mongoose 6.8.0 أيضًا دعم ألفا لـ Deno.
// Using Node.js `require()`
const mongoose = require ( 'mongoose' ) ;
// Using ES6 imports
import mongoose from 'mongoose' ;
أو استخدم createRequire()
الخاص بـ Deno لدعم CommonJS كما يلي.
import { createRequire } from 'https://deno.land/[email protected]/node/module.ts' ;
const require = createRequire ( import . meta . url ) ;
const mongoose = require ( 'mongoose' ) ;
mongoose . connect ( 'mongodb://127.0.0.1:27017/test' )
. then ( ( ) => console . log ( 'Connected!' ) ) ;
يمكنك بعد ذلك تشغيل البرنامج النصي أعلاه باستخدام ما يلي.
deno run --allow-net --allow-read --allow-sys --allow-env mongoose-test.js
متاح كجزء من اشتراك Tidelift
يعمل القائمون على صيانة mongoose وآلاف الحزم الأخرى مع Tidelift لتقديم الدعم التجاري والصيانة للتبعيات مفتوحة المصدر التي تستخدمها لبناء تطبيقاتك. يمكنك توفير الوقت وتقليل المخاطر وتحسين سلامة التعليمات البرمجية، مع الدفع لمشرفي التبعيات الدقيقة التي تستخدمها. يتعلم أكثر.
أولا، نحن بحاجة إلى تحديد الاتصال. إذا كان تطبيقك يستخدم قاعدة بيانات واحدة فقط، فيجب عليك استخدام mongoose.connect
. إذا كنت بحاجة إلى إنشاء اتصالات إضافية، فاستخدم mongoose.createConnection
.
يأخذ كل من connect
و createConnection
mongodb://
URI، أو host, database, port, options
.
await mongoose . connect ( 'mongodb://127.0.0.1/my_database' ) ;
بمجرد الاتصال، يتم تشغيل الحدث open
على مثيل Connection
. إذا كنت تستخدم mongoose.connect
، فإن Connection
هو mongoose.connection
. بخلاف ذلك، فإن قيمة الإرجاع mongoose.createConnection
هي Connection
.
ملاحظة: إذا فشل الاتصال المحلي، فحاول استخدام 127.0.0.1 بدلاً من المضيف المحلي. في بعض الأحيان قد تنشأ مشكلات عند تغيير اسم المضيف المحلي.
مهم! يقوم Mongoose بتخزين جميع الأوامر مؤقتًا حتى يتم توصيله بقاعدة البيانات. وهذا يعني أنه ليس عليك الانتظار حتى يتصل بـ MongoDB من أجل تحديد النماذج، وتشغيل الاستعلامات، وما إلى ذلك.
يتم تعريف النماذج من خلال واجهة Schema
.
const Schema = mongoose . Schema ;
const ObjectId = Schema . ObjectId ;
const BlogPost = new Schema ( {
author : ObjectId ,
title : String ,
body : String ,
date : Date
} ) ;
بصرف النظر عن تحديد بنية مستنداتك وأنواع البيانات التي تخزنها، يتعامل المخطط مع تعريف:
ويوضح المثال التالي بعض هذه الميزات:
const Comment = new Schema ( {
name : { type : String , default : 'hahaha' } ,
age : { type : Number , min : 18 , index : true } ,
bio : { type : String , match : / [a-z] / } ,
date : { type : Date , default : Date . now } ,
buff : Buffer
} ) ;
// a setter
Comment . path ( 'name' ) . set ( function ( v ) {
return capitalize ( v ) ;
} ) ;
// middleware
Comment . pre ( 'save' , function ( next ) {
notify ( this . get ( 'email' ) ) ;
next ( ) ;
} ) ;
ألقِ نظرة على المثال الموجود في examples/schema/schema.js
للحصول على مثال شامل لإعداد نموذجي.
بمجرد تحديد نموذج من خلال mongoose.model('ModelName', mySchema)
، يمكننا الوصول إليه من خلال نفس الوظيفة
const MyModel = mongoose . model ( 'ModelName' ) ;
أو فقط افعل كل ذلك مرة واحدة
const MyModel = mongoose . model ( 'ModelName' , mySchema ) ;
الوسيطة الأولى هي الاسم المفرد للمجموعة التي ينتمي إليها نموذجك. يبحث Mongoose تلقائيًا عن نسخة الجمع من اسم الطراز الخاص بك. على سبيل المثال، إذا كنت تستخدم
const MyModel = mongoose . model ( 'Ticket' , mySchema ) ;
ثم سيستخدم MyModel
مجموعة التذاكر ، وليس مجموعة التذاكر . لمزيد من التفاصيل اقرأ المستندات النموذجية.
بمجرد أن يكون لدينا نموذجنا، يمكننا بعد ذلك إنشاء مثيل له وحفظه:
const instance = new MyModel ( ) ;
instance . my . key = 'hello' ;
await instance . save ( ) ;
أو يمكننا العثور على وثائق من نفس المجموعة
await MyModel . find ( { } ) ;
يمكنك أيضًا findOne
و findById
update
وما إلى ذلك.
const instance = await MyModel . findOne ( { /* ... */ } ) ;
console . log ( instance . my . key ) ; // 'hello'
لمزيد من التفاصيل راجع المستندات.
مهم! إذا قمت بفتح اتصال منفصل باستخدام mongoose.createConnection()
ولكنك حاولت الوصول إلى النموذج من خلال mongoose.model('ModelName')
فلن يعمل كما هو متوقع لأنه غير متصل باتصال قاعدة بيانات نشط. في هذه الحالة، قم بالوصول إلى النموذج الخاص بك من خلال الاتصال الذي قمت بإنشائه:
const conn = mongoose . createConnection ( 'your connection string' ) ;
const MyModel = conn . model ( 'ModelName' , schema ) ;
const m = new MyModel ( ) ;
await m . save ( ) ; // works
مقابل
const conn = mongoose . createConnection ( 'your connection string' ) ;
const MyModel = mongoose . model ( 'ModelName' , schema ) ;
const m = new MyModel ( ) ;
await m . save ( ) ; // does not work b/c the default connection object was never connected
في مقتطف المثال الأول، حددنا مفتاحًا في المخطط يبدو كما يلي:
comments: [Comment]
حيث Comment
هو Schema
أنشأناه. وهذا يعني أن إنشاء المستندات المضمنة أمر بسيط مثل:
// retrieve my model
const BlogPost = mongoose . model ( 'BlogPost' ) ;
// create a blog post
const post = new BlogPost ( ) ;
// create a comment
post . comments . push ( { title : 'My comment' } ) ;
await post . save ( ) ;
الشيء نفسه ينطبق على إزالتها:
const post = await BlogPost . findById ( myId ) ;
post . comments [ 0 ] . deleteOne ( ) ;
await post . save ( ) ;
تتمتع المستندات المضمنة بنفس الميزات التي تتمتع بها نماذجك. الافتراضيات، المدققون، البرمجيات الوسيطة.
راجع صفحة المستندات.
يمكنك اعتراض وسيطات الطريقة عبر البرامج الوسيطة.
على سبيل المثال، سيسمح لك هذا ببث تغييرات حول مستنداتك في كل مرة يقوم فيها شخص ما set
مسار sa في مستندك إلى قيمة جديدة:
schema . pre ( 'set' , function ( next , path , val , typel ) {
// `this` is the current Document
this . emit ( 'set' , path , val ) ;
// Pass control to the next pre
next ( ) ;
} ) ;
علاوة على ذلك، يمكنك تعديل وسائط method
الواردة بحيث ترى البرامج الوسيطة اللاحقة قيمًا مختلفة لتلك الوسائط. للقيام بذلك، فقط قم بتمرير القيم الجديدة إلى next
:
schema . pre ( method , function firstPre ( next , methodArg1 , methodArg2 ) {
// Mutate methodArg1
next ( 'altered-' + methodArg1 . toString ( ) , methodArg2 ) ;
} ) ;
// pre declaration is chainable
schema . pre ( method , function secondPre ( next , methodArg1 , methodArg2 ) {
console . log ( methodArg1 ) ;
// => 'altered-originalValOfMethodArg1'
console . log ( methodArg2 ) ;
// => 'originalValOfMethodArg2'
// Passing no arguments to `next` automatically passes along the current argument values
// i.e., the following `next()` is equivalent to `next(methodArg1, methodArg2)`
// and also equivalent to, with the example method arg
// values, `next('altered-originalValOfMethodArg1', 'originalValOfMethodArg2')`
next ( ) ;
} ) ;
type
، عند استخدامه في المخطط، يكون له معنى خاص داخل Mongoose. إذا كان مخططك يتطلب استخدام type
كخاصية متداخلة، فيجب عليك استخدام تدوين الكائن:
new Schema ( {
broken : { type : Boolean } ,
asset : {
name : String ,
type : String // uh oh, it broke. asset will be interpreted as String
}
} ) ;
new Schema ( {
works : { type : Boolean } ,
asset : {
name : String ,
type : { type : String } // works. asset is an object with a type property
}
} ) ;
تم بناء Mongoose على رأس برنامج تشغيل MongoDB Node.js الرسمي. يحتفظ كل نموذج نمس بمرجع إلى مجموعة برامج تشغيل MongoDB الأصلية. يمكن الوصول إلى كائن المجموعة باستخدام YourModel.collection
. ومع ذلك، فإن استخدام كائن المجموعة يتجاوز مباشرة جميع ميزات النمس، بما في ذلك الخطافات والتحقق من الصحة وما إلى ذلك. الاستثناء الوحيد الملحوظ هو أن YourModel.collection
لا يزال يخزن الأوامر مؤقتًا. على هذا النحو، لن يقوم YourModel.collection.find()
بإرجاع المؤشر.
ابحث عن مستندات API هنا، والتي تم إنشاؤها باستخدام dox وacquit.
حقوق الطبع والنشر (ج) 2010 LearnBoost <[email protected]>
يُمنح الإذن مجانًا لأي شخص يحصل على نسخة من هذا البرنامج وملفات الوثائق المرتبطة به ("البرنامج") للتعامل في البرنامج دون قيود، بما في ذلك، على سبيل المثال لا الحصر، حقوق الاستخدام والنسخ والتعديل والدمج. ونشر و/أو توزيع وترخيص من الباطن و/أو بيع نسخ من البرنامج، والسماح للأشخاص الذين تم توفير البرنامج لهم بالقيام بذلك، وفقًا للشروط التالية:
يجب تضمين إشعار حقوق الطبع والنشر أعلاه وإشعار الإذن هذا في جميع النسخ أو الأجزاء الكبيرة من البرنامج.
يتم توفير البرنامج "كما هو"، دون أي ضمان من أي نوع، صريحًا أو ضمنيًا، بما في ذلك، على سبيل المثال لا الحصر، ضمانات القابلية للتسويق والملاءمة لغرض معين وعدم الانتهاك. لا يتحمل المؤلفون أو أصحاب حقوق الطبع والنشر بأي حال من الأحوال المسؤولية عن أي مطالبة أو أضرار أو مسؤولية أخرى، سواء في إجراء العقد أو الضرر أو غير ذلك، الناشئة عن أو خارج أو فيما يتعلق بالبرنامج أو الاستخدام أو المعاملات الأخرى في برمجة.