เมื่อพยายามจะ Migrate Data จาก MongoDB (DocumentDB) ไปยัง On-Premise MongoDB โดยบังคับต้องมี Condition ในการ Migrate
โอเค เจ็บปวดจริงกับเรื่องนี้ เพราะต้องพยายาม Migrate ของจาก DocumentDB ที่มันเป็น MongoDB 4 ไปยัง MongoDB ตัวใหม่ โดยมี Criteria ในการ Migrate โดยจะต้องย้ายเฉพาะข้อมูลของลูกค้าเจ้านึงเท่านั้น ห้ามเอาข้อมูลของลูกค้าเจ้าอื่นไปด้วย ทำไงละทีนี้
ต้องบอกก่อนว่า Data ที่จะ Migrate ไป อยู่คนละ DB กันกับข้อมูล Identity User เอาหล่ะ แน่นอน ลอง aggregate โดยใช้ $lookup
กันม่ะ และแล้ว ความเจ็บปวดก็ตามมา
For sharded collections, $lookup
is only available on Atlas clusters running MongoDB 5.1 and later.
ใช่ครับ aggregate $lookup
ไม่สามารถใช้ข้าม DB ได้ จะใช้ได้เมื่อคุณใช้บน Atlas เท่านั้น โว้ยยยยยยย ทำไงละทีนี้ เอาละ ไม่เป็นไรๆ ลองหาทางอื่นๆ งั้นต้องลงทุน dump ข้อมูลจาก DB ถังนี้ กลับไปยังถังเดียวกับ Identity User โดยใช้คำสั่ง aggregate อีกเช่นกัน
db.getSiblingDB("db2").collection2.aggregate([
{
$merge: { into: { db: "db1", coll: "tmpCollection2" } }
}
])
หลังจาก Run บึ้มมม
{
"message" : "Unrecognized pipeline stage name: '$merge'",
"ok" : 0,
"code" : 40324,
"operationTime" : Timestamp(1683544198, 1)
}
หลังจากไปหาข้อมูล MongoDB 4.0 หรือไอ DocumentDB 4.0 เนี่ย ไม่รองรับ pipeline $merge
Starting in MongoDB 4.4
เวรกำ!! ของพี่มันเก่า รักเรามันเก่าไปละ dump มือก็ได้วะ
หลังจาก dump เสร็จ ก็ใช้คำสั่ง aggregate เพื่อสร้าง pipeline สำหรับ filter ข้อมูลขึ้นมาดังนี้
- aggregate collection 1 กับ collection 2 เข้าด้วยกัน ด้วย field ที่ relate ก้น
- filter เอาชุดข้อมูลที่ตรงตาม criteria ที่อยากได้
- ทำการ re-structure ให้เหมือนกัน data ใน collection ที่ 1 เพื่อเตรียม export ไปยัง db เป้าหมาย
db.collection1.aggregate([
{
$lookup:
{
from: "collection2",
localField: "username",
foreignField: "username",
as: "auth",
},
},
{
$match:
{
auth: {
'type': '1',
},
},
},
{
$project:
{
auth: 0,
},
},
])
รักพี่มันเก่าไปแล้วสินะ ปวดหัวจัด 555555