เมื่อพยายามจะ 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.
$lookup

ใช่ครับ 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
$merge (aggregation)

เวรกำ!! ของพี่มันเก่า รักเรามันเก่าไปละ dump มือก็ได้วะ


หลังจาก dump เสร็จ ก็ใช้คำสั่ง aggregate เพื่อสร้าง pipeline สำหรับ filter ข้อมูลขึ้นมาดังนี้

  1. aggregate collection 1 กับ collection 2 เข้าด้วยกัน ด้วย field ที่ relate ก้น
  2. filter เอาชุดข้อมูลที่ตรงตาม criteria ที่อยากได้
  3. ทำการ 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