آشنایی با دستور MongoDB Projection در مانگو دی بی

آشنایی با دستور MongoDB Projection در مانگو دی بی

در این مقاله آشنایی با دستور MongoDB Projection در مانگو دی بی از بخش آموزش مانگو دی بی و عملیات CRUD در مانگو دی بی پس از آموزش مقاله آشنایی با دستور find در مانگو دی بی می خواهیم نحوه استفاده از MongoDB Projection در مانگو دی بی را به جهت انتخاب یک یا چندین فیلد را برای خروجی و نمایش اسنادی Documents از کالکشن Collection یاد خواهید گرفت.

دستور MongoDB Projection در مانگو دی بی چه کاربردی دارد؟

شما با استفاده از دستور می توانید در نمایش سند یا اسنادی Documents از یک کالکشن Collection فقط فیلدهایی که مدنظر دارید را انتخاب و در خروجی نمایش دهید.

آشنایی با MongoDB Projection در مانگو دی بی

در MongoDB، با استفاده از Projection به سادگی می توانید فیلدهایی از یک کوئری Documents اسنادی انتخاب کنید و نمایش دهید.

به طور پیش فرض، شما با استفاده از متدهای ()find و ()findOne می توانید تمام فیلدهای موجود در Documents اسناد در کالکشت را برمی گرداند.

بیشتر اوقات شما به داده های همه فیلدها و ستون های سند نیاز ندارید.

برای انتخاب فیلدهایی که باید از یک کوئری نمایش داده شود، می توانید فیلد مورد نظر را در یک سند مشخص کنید و سند موردنظر را به متدهای ()find و ()findOne منتقل کنید تا فراخوانی و نمایش دهد که به این سندها projection document می گویند.

برای تعیین اینکه چه فیلد هایی در اسناد مورد نظر نمایش داده شود، از دستور زیر استفاده می کنید:

{ <field>: value, ...}

اگر مقدار value برابر 1 یا true باشد، <field> در اسناد مورد نظر انتخابی گنجانده می شود. در صورتی که مقدار value برابر 0 یا false باشد، از اسناد برگشت داده شده حذف می شود.

اگر مقدار projection در سند {} خالی باشد، تمام فیلدهای موجود در اسناد برگشتی گنجانده را نمایش می دهد.

برای تعیین فیلدها در یک سند embedded document ، از علامت dot به صورت زیر استفاده می کنید:

{ "<embeddedDocument>.<field>": value, ... }

به طور مشابه، برای گنجاندن <field> از یک سند embedded document واقع در یک آرایه، از نحو علامت dot زیر استفاده می کنید:

{ "<arrayField>.field": value, ...}

مثال هایی از MongoDB projection

ما از collection کالکشن به نام products برای زیر برای مثال هایی از projection استفاده خواهیم کرد:

db.products.insertMany([
    { "_id" : 1, "name" : "xPhone", "price" : 799, "releaseDate": ISODate("2011-05-14"), "spec" : { "ram" : 4, "screen" : 6.5, "cpu" : 2.66 },"color":["white","black"],"storage":[64,128,256],"inventory":[{ qty: 1200,"warehouse": "San Jose"}]},
    { "_id" : 2, "name" : "xTablet", "price" : 899, "releaseDate": ISODate("2011-09-01") , "spec" : { "ram" : 16, "screen" : 9.5, "cpu" : 3.66 },"color":["white","black","purple"],"storage":[128,256,512],"inventory":[{ qty: 300,"warehouse": "San Francisco"}]},
    { "_id" : 3, "name" : "SmartTablet", "price" : 899, "releaseDate": ISODate("2015-01-14"), "spec" : { "ram" : 12, "screen" : 9.7, "cpu" : 3.66 },"color":["blue"],"storage":[16,64,128],"inventory":[{ qty: 400,"warehouse": "San Jose"},{ qty: 200,"warehouse": "San Francisco"}]},
    { "_id" : 4, "name" : "SmartPad", "price" : 699, "releaseDate": ISODate("2020-05-14"),"spec" : { "ram" : 8, "screen" : 9.7, "cpu" : 1.66 },"color":["white","orange","gold","gray"],"storage":[128,256,1024],"inventory":[{ qty: 1200,"warehouse": "San Mateo"}]},
    { "_id" : 5, "name" : "SmartPhone", "price" : 599,"releaseDate": ISODate("2022-09-14"), "spec" : { "ram" : 4, "screen" : 5.7, "cpu" : 1.66 },"color":["white","orange","gold","gray"],"storage":[128,256]}
 ])

1) نمایش تمام فیلدها در اسناد مشخص شده

اگر مقادیر projection document را مشخص نکنید، متد ()find همه فیلدهایی را در اسناد مشخص شده را شامل می شود و نمایش خواهد داد.

به عنوان مثال، کوئری زیر همه فیلدها را از تمام documents اسناد مجموعه به نام products که مقدار price آن برابر 899 است را بر می گرداند و نمایش می دهد:

db.products.find({price: 899});

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

[
  {
    _id: 2,
    name: 'xTablet',
    price: 899,
    releaseDate: ISODate("2011-09-01T00:00:00.000Z"),
    spec: { ram: 16, screen: 9.5, cpu: 3.66 },
    color: [ 'white', 'black', 'purple' ],
    storage: [ 128, 256, 512 ],
    inventory: [ { qty: 300, warehouse: 'San Francisco' } ]
  },
  {
    _id: 3,
    name: 'SmartTablet',
    price: 899,
    releaseDate: ISODate("2015-01-14T00:00:00.000Z"),
    spec: { ram: 12, screen: 9.7, cpu: 3.66 },
    color: [ 'blue' ],
    storage: [ 16, 64, 128 ],
    inventory: [
      { qty: 400, warehouse: 'San Jose' },
      { qty: 200, warehouse: 'San Francisco' }
    ]
  }
]

2) نمایش فیلدهای مشخص شده از جمله فیلد id_

اگر فیلدهای خودتان را در projection document مشخص کنید، متد ()find فقط این فیلدهایی که در قسمت projection مشخص کرده اید به همراه فیلد _id را در خروجی بر می گرداند و نمایش می دهد.

در مثال زیر تمام اسناد documents را از کالکشن collection به نام products بر می گرداند. با این حال، نتیجه آن کوئری فقط فیلدهایی شامل name, price و فیلد id_ در اسناد موردنظر خواهد بود و نمایش داده خواهد شد:

db.products.find({}, {
    name: 1,
    price: 1
});

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

[
  { _id: 1, name: 'xPhone', price: 799 },
  { _id: 2, name: 'xTablet', price: 899 },
  { _id: 3, name: 'SmartTablet', price: 899 },
  { _id: 4, name: 'SmartPad', price: 699 },
  { _id: 5, name: 'SmartPhone', price: 599 }
]

برای عدم نمایش فیلد id_، باید آن را به طور صریح و واضح در سند projection document به صورت زیر کامل مشخص کنید:

db.products.find({}, {
    name: 1,
    price: 1
,
    _id: 0
});

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

[
  { name: 'xPhone', price: 799 },
  { name: 'xTablet', price: 899 },
  { name: 'SmartTablet', price: 899 },
  { name: 'SmartPad', price: 699 },
  { name: 'SmartPhone', price: 599 }
]

3) نمایش همه فیلدها به جز برخی از فیلدها

اگر تعداد فیلدهایی که باید برگردانده و نمایش داده شود زیاد است، می‌توانید از projection document برای حذف فیلدهایی که نمی خواهید نمایش داده شود استفاده کنید.

در مثال زیر می خواهیم تمام فیلدهای سندی که id_ برابر 1 است را به جز فیلدهای releaseDate, spec و storage برمی گرداند و نمایش دهد:

db.products.find({_id:1}, {
    releaseDate: 0,
    spec: 0,
    storage: 0
})

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

[
  {
    _id: 1,
    name: 'xPhone',
    price: 799,
    color: [ 'white', 'black' ],
    inventory: [ { qty: 1200, warehouse: 'San Jose' } ]
  }
]

4) نمایش تمام فیلدها در اسناد (embedded documents)

در مثال زیر قصد داریم فیلدهای name, price و id_ سندی که مقدار id_ برابر 1 باشد را برمی‌گرداند و نمایش دهد. همچنین فیلد screen روی سند embedded document را در خروجی برمی‌گرداند و نمایش می دهد:

db.products.find({_id:1}, {
    name: 1,
    price: 1,
    "spec.screen": 1
})

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

[ { _id: 1, name: 'xPhone', price: 799, spec: { screen: 6.5 } } ]

از سرور نسخه MongoDB 4.4 به بعد به شما این امکان را می دهد که فیلدهایی که ساختار تودرتو nested form دارند را با استفاده از دستور زیر مشخص کنید و نمایش دهید:

db.products.find({_id:1}, {
    name: 1,
    price: 1,
    spec : { screen: 1 }
})

5) Projecting fields بر روی اسناد embedded documents در یک آرایه

در مثال زیر را با استفاده از projection ستون های زیر را مشخص کنید:

  • به صورت پیش فرض فیلد id_
  • ستون name
  • و ستون qty در سند documents embedded در آرایه ای به نام inventory
db.products.find({}, {
    name: 1,
    "inventory.qty": 1
});

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

[
  { _id: 1, name: 'xPhone', inventory: [ { qty: 1200 } ] },
  { _id: 2, name: 'xTablet', inventory: [ { qty: 300 } ] },
  {
    _id: 3, name: 'SmartTablet', inventory: [ { qty: 400 }, { qty: 200 } ]
  },
  { _id: 4, name: 'SmartPad', inventory: [ { qty: 1200 } ] },
  { _id: 5, name: 'SmartPhone' }
]

خلاصه می کنیم

  • با مشخص کردن مقدار {<field>: 1} اسنادی که منطبق با فیلدهای موردنظر باشد را شامل می شود و با مقدار {<field>: 0} این فیلدهایی را شامل نخواهد شد.
  • با مشخص کردن مقدار { <embeddedDocument>.<field>: 1} اسنادی که <embeddedDocument> با فیلدهای موردنظر باشد را شامل می شود و مقدار { <embeddedDocument>.<field>: 0} برعکس این موضوع است.
  • با مشخص کردن مقدار { <arrayField>.<field>: 1} اسنادی که <field> با فیلدهای موردنظر در اسناد embedded document در یک آرایه باشد را شامل می شود و مقدار { <arrayField>.<field>: 0} برعکس این موضوع است.

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

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

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

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