در این مقاله آشنایی با دستور 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}
اسنادی که
با فیلدهای موردنظر در اسناد embedded document در یک آرایه باشد را شامل می شود و مقدار<field>
برعکس این موضوع است.{ <arrayField>.<field>: 0}
برای ادامه آموزش مانگو دی بی MongoDB می توانید مقاله آشنایی با عملگر eq$ در MongoDB را مطالعه کنید.