MongoDB ลบองค์ประกอบขึ้นอยู่กับองค์ประกอบก่อนหน้า (การทำซ้ำ)

Aug 19 2020

ฉันต้องการลบองค์ประกอบ ($ unset) ออกจากวัตถุ MongoDB ของฉันด้วยเงื่อนไขหาก Object เดียวกันมีองค์ประกอบที่คล้ายกัน วัตถุของฉัน:

{
   "_id": "5eabf8b144345b36b00bfbaa",
   "ranktime": [{
      "pos":"2",
      "datum":"Mon May 05 2020 12:22:52 GMT+0200 (GMT+02:00)",
      "source":"SOURCE2"
    },{
      "pos":"1",
      "datum":"Fri May 01 2020 12:23:10 GMT+0200 (GMT+02:00)",
      "source":"SOURCE1"
    },{
      "pos":"37",
      "datum":"Fri May 01 2020 12:25:14 GMT+0200 (GMT+02:00)",
      "source":"SOURCE2"
    },{
      "pos":"12",
      "datum":"Fri May 01 2020 12:25:14 GMT+0200 (GMT+02:00)",
      "source":"SOURCE2"
    },{
      "pos":"37",
      "datum":"Fri May 01 2020 18:45:27 GMT+0200 (GMT+02:00)",
      "source":"SOURCE2"
    }]
}

ดังนั้นฉันต้องการลบรายการในranktimeif ranktime.source == "SOURCE2"และถ้าวันที่ตรงกับออบเจ็กต์ก่อนหน้านี้ อันที่จริงฉันต้องวนซ้ำผ่านองค์ประกอบเดียวของranktime. เป็นไปได้ใน MongoDB หรือไม่?

ผลที่คาดว่าจะได้รับคือ:

{
   "_id": "5eabf8b144345b36b00bfbaa",
   "ranktime": [{
      "pos":"2",
      "datum":"Mon May 05 2020 12:22:52 GMT+0200 (GMT+02:00)",
      "source":"SOURCE2"
    },{
      "pos":"1",
      "datum":"Fri May 01 2020 12:23:10 GMT+0200 (GMT+02:00)",
      "source":"SOURCE1"
    },{
      "pos":"37",
      "datum":"Fri May 01 2020 12:25:14 GMT+0200 (GMT+02:00)",
      "source":"SOURCE2"
    }]
}

คำตอบ

1 mickl Aug 19 2020 at 08:38

โดยทั่วไปคุณสามารถใช้$ ลดเพื่อประมวลผลอาร์เรย์และกำหนดองค์ประกอบก่อนหน้าโดยใช้คำสั่ง$ letและ$ arrayElemAt ไวยากรณ์$ setใหม่ช่วยให้คุณสามารถใช้การรวมภายในคำสั่งอัพเดต:

db.col.updateMany({}, [
    {
        $set: { ranktime: { $reduce: {
                    input: "$ranktime", initialValue: [], in: { $let: {
                            vars: { last: { $arrayElemAt: [ "$$value", -1 ] } },
                            in: {
                                $cond: [ { $and: [ 
                                            { "$eq": [ "$$last.source", "SOURCE2" ] },
                                            { "$eq": [ { $substr: [ "$$last.datum", 0, 15 ] }, { $substr: [ "$$this.datum", 0, 15 ] } ] }, ] }, "$$value",
                                    { $concatArrays: [ "$$value", [ "$$this" ] ] }
                                ]
                            }
                        }
                    }
                }
            }
        }
    }
])

ตัวอย่างการรวม