آشنایی با دستور InsertMany در مانگو دی‌ بی

آشنایی با دستور InsertMany در مانگو دی‌ بی

در این مقاله آشنایی با دستور ()InsertMany در مانگو دی‌ بی از بخش آموزش مانگو دی بی پس از آشنایی با مبانی مانگو دی بی و آشنایی با دستور InsertOne در مانگو دی‌ بی می خواهیم در مانگو دی‌ بی با استفاده از متد ()InsertMany بتوانیم چندین سند (اسنادی) Documents به صورت هم‌زمان را به Collection در پایگاه داده اینسرت یا اضافه کنیم.

متد ()InsertMany در مانگو دی‌ بی چه کاربردی دارد؟

شما با استفاده از متد ()InsertMany می توانید چندین سند (یک یا چند سند) document جدیدی را به کالکشنی Collection در پایگاه داده مانگو دی بی اضافه یا insert کنید.

معرفی متد ()InsertMany در مانگو دی بی

متد ()InsertMany به شما این اجازه را می‌دهد که به صورت هم‌زمان چندین سند Documents را به کالکشن Collection اضافه یا Insert کنید که ساختار دستوری متد ()InsertMany به شکل زیر است:

db.collection.insertMany(
   [document1, document2, ...],
   {
      writeConcern: <document>,
      ordered: <boolean>
   }
)

متد ()InsertMany دارای 2 پارامتر یا آرگومان ورودی اختیاری می باشد.

[ …,document1, document2]

اولین پارامتر ورودی متد ()InsertMany یک آرایه array از لیست اسنادی می باشد که می‌خواهید به کالکشن Collection اضافه یا اینسرت کنید.

Option

پارامتر دوم متد ()InsertMany هم در واقع مشخص کننده فیلد ها و ستون های اسنادی Documents هستش که می خواهید به صورت (فیلد ـ مقدار) field-and-value در کالکشن Collection اضافه یا اینسرت کنید. این پارامتر هم اختیاری می باشد.

{
   writeConcern: <document>,
   ordered: <boolean>
}

فیلد پارامتر writeConcern که مشخص کننده مقادیر و پارامترهایی write concern در سند است که مقدار فیلد writeConcern مشخص نشود. متد ()InsertMany می‌آید از write concern پیش‌فرض استفاده می‌کند.

فیلد یا ستون ordered یک مقدار منطقی boolean است که مشخص می‌کنید مانگو دی‌ بی می‌خواهد عملیات اینسرت یا درج اسناد را به صورت منظم ordered یا نامرتب unordered انجام دهد.

زمانی مقدار فیلد ordered برابر true باشد، متد ()InsertMany اسناد Documents را به صورت مرتب ordered و منظم (به ترتیب) در کالکشن Collection اینسرت یا درج می‌کند. که مقدار پیش‌فرض این فیلد هم true می‌باشد.

زمانی که مقدار فیلد ordered برابر false باشد مانگو دی‌ بی می‌آید اسناد Documents را قبل از این‌ که در کالکشن Collection اینسرت شود را اصطلاحاً مرتب ordered می‌کند که عملیات در بعضی مواقع باعث افزایش بهره‌وری و عملکرد در عملیات اینزرت می‌شود.

در ادامه در خصوص اینسرت چندین اسناد Documents به صورت ordered یا unordered مثال‌هایی خواهیم زد.

متد ()InsertMany در صورتی که عملیات درج اسناد Documents با موفقیت اجرا شود یک سند Document در خروجی برمی‌گرداند و نمایش می دهد که دو مقدار در خروجی نمایش می دهد:

  • مقدار فیلد acknowledged به صورت منطقی اگر برابر true باشد عملیات اینسرت با موفقیت انجام می شود. اگر عملیات با خطا مواجه شود مقدار acknowledged برابر false خواهد شد.
  • یک آرایه و لیستی از مقادیر فیلد _id که نشان می‌دهد چه اسنادی Documents که با موفقیت در کالکشن Collection درج و اینسرت شده است مقدار فیلد _id آن را در خروجی نمایش خواهد داد.

ایجاد کالکشن جدید (Collection creation)

اگر در پایگاه داده‌ مانگو دی بی کالکشنی وجود نداشته باشد یا کالکشن مورد نظر وجود نداشته باشد می‌توانید از طریق متد ()InsertMany یک کالکشن Collection جدیدی می توانید ایجاد کنید.

زمانی که بخواهید اسنادی را به کالکشن مربوطه اینسرت و اضافه کنید و کالکشن که اسناد Documents بایستی در آن درج شود وجود نداشته باشد با متد ()InsertMany می توانید ابتدا کالکشن Collection را ایجاد کرده و سپس اسناد را به کالکشن Collection اضافه و اینسرت می کند.

فیلد id_

اگر در زمان اینسرت اسناد Documents برای فیلد id_ مقداری تخصیص ندهید و مشخص نکنید کلاس ObjectId یک مقدار منحصر به‌ فرد unique تولید کرده و به فیلد id_ اختصاص می‌دهد و قبل از این که اسناد Documents جدیدی در کالکشن Collection اینسرت شود مقادیری را برای فیلد id_ تولید کرده و به آن اختصاص می‌دهد.

اگر شما در زمان اینسرت اسناد Documents مقدار فیلد id_ را مشخص کنید (به صورت دستی به آن مقدار بدهید) در زمان اینسرت اسناد Documents به کالکشن Collection باید حتماً مقدار فیلد id_ در کالکشن منحصر به‌ فرد unique باشد.

در غیر این صورت به شما خطای duplicate key error را می‌دهد و سندها Documents را در کالکشن Collection درج نخواهد کرد.

مدیریت خطاها (Error handling)

زمانی که متد ()InsertMany با خطا اجرا شود یک exception به نام BulkWriteError فراخوانی و صدا زده می‌شود.

زمانی که بخواهید چندین سند را هم‌ زمان به کالکشنی Collection اضافه یا اینسرت کنید، و زمانی به هر دلیلی در این فرآیند با خطا مواجه شود 2 رفتار در مواجه با خطا انجام می‌دهد:

زمانی که اینسرت اسناد Documents در کالکشن Collection به صور مرتب ordered باشد در زمان خطا فرآیند Stop می‌شود اما درحالت نامرتب unordered اگر یک سند به خطا بخورد فرآیند را ادامه داده و سراغ سندهای بعدی می‌رود و بعد از اتمام کامل لیست سندهای موفق و خطا خورده را نمایش می‌دهد.

مثال‌هایی از استفاده‌ی متد ()InsertMany در مانگو دی‌ بی

در اولین مرحله برای ورود به پوسته‌ی Mongodb Shell با وارد کردن دستور mongo در Command Prompt در ویندوز یا در محیط Terminal در سیستم عامل های های لینوکسی و MacOS وارد این محیط شده و سپس به پایگاه داده به نام bookdb از طریق دستور زیر متصل می‌شویم.

1) استفاده از متد ()InsertMany در مانگو دی‌ بی برای اینسرت چندین Documents به Collection بدون مشخص کردن مقداری برای فیلد id_

در مثال زیر ما از متد ()InsertMany استفاده می‌کنیم. برای اینسرت چندین سند Documents (به صورت هم‌زمان) بدون این که برای فیلد id_ مقدار را مشخص شود:

db.books.insertMany([
   { title:  "NoSQL Distilled", isbn: "0-4696-7030-4"},
   { title:  "NoSQL in 7 Days", isbn: "0-4086-6859-8"},
   { title:  "NoSQL Database", isbn: "0-2504-6932-4"},
]);

خروجی دستور بالا به شکل زیر نمایش داده خواهد شد:

{
  acknowledged: true,
  insertedIds: {
    '0': ObjectId("62148d16f514a446bf1a98f1"),
    '1': ObjectId("62148d16f514a446bf1a98f2"),
    '2': ObjectId("62148d16f514a446bf1a98f3")
  }
}

دلیل این ‌که برای اسناد مقدار فیلد id_ را مشخص نمی‌کنیم این است مقدار فیلد id_ به صورت خودکار از طریق کلاس ObjectId برای هر سند عددی منحصر‌ به‌ فرد تولید کند به فیلد id_ اختصاص می دهد.

بعد از این که سندها Documents در کالکشن Collection با موفقیت درج شد برای نمایش سندها از متد ()find استفاده می کنیم :

db.books.find()

خروجی دستور بالا به شکل زیر نمایش داده می‌شود:

[
  {
    _id: ObjectId("62148d16f514a446bf1a98f1"),
    title: 'NoSQL Distilled',
    isbn: '0-4696-7030-4'
  },
  {
    _id: ObjectId("62148d16f514a446bf1a98f2"),
    title: 'NoSQL in 7 Days',
    isbn: '0-4086-6859-8'
  },
  {
    _id: ObjectId("62148d16f514a446bf1a98f3"),
    title: 'NoSQL Database',
    isbn: '0-2504-6932-4'
  }
]
boo

2) استفاده از متد ()InsertMany در مانگو دی‌ بی برای اینسرت چندین Documents به Collection در صورتی که می‌خواهیم مقادیری برای فیلد id_ را به صورت دستی مشخص کنیم.

با استفاده از دستور زیر با استفاده از متد ()InsertMany با مشخص مقدار فیلد id_ به صورت دستی چندین سند Documents به طور همزمان را به کالکشن Collection اینسرت می‌کنیم.

db.books.insertMany([
   { _id: 1, title:  "SQL Basics", isbn: "0-7925-6962-8"},
   { _id: 2, title:  "SQL Advanced", isbn: "0-1184-7778-1"}
]);

خروجی دستور بالا به شکل زیر نمایش داده خواهد شد:

{ acknowledged: true, insertedIds: { '0': 1, '1': 2 } }

در دستور زیر می‌ خواهیم در اینسرت اسناد Documents ، برای فیلد id_ مقادیر تکراری و مقادیری که در کالکشن Collection می‌باشد، اضافه کنیم.

db.books.insertMany([
   { _id: 2, title:  "SQL Performance Tuning", isbn: "0-6799-2974-6"},
   { _id: 3, title:  "SQL Index", isbn: "0-5097-1723-3"}
]);

همان‌طور که می‌بینید مقدار فیلد id_ برابر 2 می باشد که در کالکشن Collection وجود دارد و مانگو دی‌ بی سند را اینسرت نکرده و به شما خطا را به شکل زیر نمایش می‌دهد:

Uncaught:
MongoBulkWriteError: E11000 duplicate key error collection: bookdb.books index: _id_ dup key: { _id: 2 }
Result: BulkWriteResult {
  result: {
    ok: 1,
    writeErrors: [
      WriteError {
        err: {
          index: 0,
          code: 11000,
          errmsg: 'E11000 duplicate key error collection: bookdb.books index: _id_ dup key: { _id: 2 }',
          errInfo: undefined,
          op: {
            _id: 2,
            title: 'SQL Performance Tuning',
            isbn: '0-6799-2974-6'
          }
        }
      }
    ],
    writeConcernErrors: [],
    insertedIds: [ { index: 0, _id: 2 }, { index: 1, _id: 3 } ],
    nInserted: 0,
    nUpserted: 0,
    nMatched: 0,
    nModified: 0,
    nRemoved: 0,
    upserted: []
  }
}

3) اینسرت اسناد به صورت نامرتب (Unordered)

به صورت دستور زیر از طریق متد ()InsertMany می‌توانید اسنادی Documents را به صورت نامرتب Unordered در کالکشن Collection اینسرت کنید:

db.books.insertMany(
   [{ _id: 3, title:  "SQL Performance Tuning", isbn: "0-6799-2974-6"},
   { _id: 3, title:  "SQL Trees", isbn: "0-6998-1556-8"},
   { _id: 4, title:  "SQL Graph", isbn: "0-6426-4996-0"},
   { _id: 5, title:  "NoSQL Pros", isbn: "0-9602-9886-X"}], 
   { ordered: false }
);

همان‌طور در دستور بالا می‌بینید مقدار id : 3_ تکراری می‌باشد و مانگو دی‌ بی این را یک خطا نمایش خواهد داد.

چون در این دستور‌ها اینسرت اسناد Documents را به صورت نامرتب Unordered انجام داده عملیات فرآیند Insert خطا نداده و متوقف نمی‌شود و سندی که خطا دارد را نادیده گرفته و سراغ سند بعدی می‌رود تا کل عملیات به پایان برسد.

در دستور بالا از 4 سندی که خواستید اینسرت شود 3 سند در کالکشن Collection اینسرت شده و دومی که فیلد id_ تکراری اینسرت نخواهد شد.

از طریق دستور زیر می‌توانید سندهایی Documents که در حال حاضر اینسرت کردید را مشاهده کنید.

db.books.find()

خروجی دستور به شکل زیر نمابش داده می شود:

[
  {
    _id: ObjectId("62148d16f514a446bf1a98f1"),
    title: 'NoSQL Distilled',
    isbn: '0-4696-7030-4'
  },
  {
    _id: ObjectId("62148d16f514a446bf1a98f2"),
    title: 'NoSQL in 7 Days',
    isbn: '0-4086-6859-8'
  },
  {
    _id: ObjectId("62148d16f514a446bf1a98f3"),
    title: 'NoSQL Database',
    isbn: '0-2504-6932-4'
  },
  { _id: 1, title: 'SQL Basics', isbn: '0-7925-6962-8' },
  { _id: 2, title: 'SQL Advanced', isbn: '0-1184-7778-1' },
  { _id: 3, title: 'SQL Performance Tuning', isbn: '0-6799-2974-6' },
  { _id: 4, title: 'SQL Graph', isbn: '0-6426-4996-0' },
  { _id: 5, title: 'NoSQL Pros', isbn: '0-9602-9886-X' }
]

خلاصه

  • در این آموزش MongoDB با استفاده از متد ()InsertMany می‌توانید چندین سند Documents (همزمان) به کالکشن Collection اضافه کنید.
  • در زمان اینسرت اسناد Documents اگر مقدار پارامتر ordered برابر true باشد متد ()InsertMany عملیات اینسرت اسناد را به صورت نامرتب Unordered انجام می‌دهد. بنابراین در صورتی که اسنادی Documents در عملیات اینسرت در کالکشن Collection به خطا بخورد عملیات کلی متوقف نشده و وارد سند بعدی خواهد شد.

برای ادامه آموزش مانگو دی‌ بی MongoDB می توانید مقاله آشنایی با دستور findOne در مانگو دی بی را مطالعه کنید.

محسن زمانی هستم، برنامه نویس و طراح وب ، سئو هم بلدم . به هدف تفریح و سرگرمی این وب سایت رو طراحی کردم تا مطالبی که دوست دارم رو اینجا به اشتراک بزارم.

دیدگاه خود را بنویسید:

آدرس ایمیل شما نمایش داده نخواهد شد.