دیتابیس مونگو bulkWrite: اپدیت کردن یک field از چند document با چند value متفاوت
اگر بخواهید order یا position یا همان ترتیب نمایش چند محصول یا چند مقاله در یک لیست محصولات یا لیست مقالات را تغییر دهید باید فیلد order (یا هر نام دیگری که خودتان دادید) را اپدیت کنید. بدین منظور باید فیلد order برای چند دایکومنت اپدیت شود.
اگر postgres یا mySQL بود براحتی از یک عبارت استفاده میکردیم اما در مونگو باید از bulkWrite استفاده کنیم. شاید در نگاه اول اینطور بنظر برسد که updateMany کار راه می اندازد. updateMany فقط میتواند یک مقدار را به یک فیلد در چند دایکومنت بدهد اما نمیتواند چند مقدار به یک فیلد در چند دایکومنت بدهد.
یک راه عامیانه: for و updateOne
برای حل این موضوع از bulkWrite و updateOne که در bulkWrite قرار خواهد گرفت، استفاده میکنیم. اما اجازه دهید بجای bulkWrite و updateOne از راهی که ممکن است به ذهن هر کسی برسد رونمایی کنیم: استفاده از for و updateOne
// this is imposible in mongo to
// update a field in some documents with multi values!
for (i = 0; i < data.length; i++) {
await collection.updateOne({_id: data[i].id}, {$set: {
order: data[i].order
}
});
}
راه رسمی: bulkWrite و updateOne
var arr = data.reduce((cur, item) => {
cur.push({
"updateOne": {
"filter": {"_id": item.id},
"update": {"$set": {"order": item.order}},
"upsert": true
}
});
return cur;
},[]);
await collection.bulkWrite(arr);
اگر مقدار های ورودی که باید اپدیت شوند زیاد است میتوانید یک ارایه بسازید سپس ان را داخل bulkWrite قرار دهید. مانند کد های بالا.
در کدهای بالا از reduce برای تولید یک ارایه که قرار است در bulkWrite قرار بگیرد بهره بردیم. میتوانستیم این کار را با for یا forEach هم انجام دهیم.
با توجه به دایکومنتیشن های سایت mongo ، میتوان وجود filter و update را دید اما اگر از mongoose استفاده میکنید از upsert هم باید استفاده کنید. (مانند کدهای بالا)