MongoDB menghapus elemen tergantung pada elemen sebelumnya (Iterasi)
Aug 19 2020
Saya ingin menghapus elemen ($ unset) dari Objek MongoDB saya dengan kondisi jika Objek yang sama memiliki elemen yang serupa. Objek Saya:
{
"_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"
}]
}
Jadi saya ingin menghapus entri di ranktime
jika ranktime.source == "SOURCE2"
dan jika tanggalnya sama dengan objek sebelumnya. Sebenarnya saya harus mengulang melalui satu elemen ranktime
. Apakah ini mungkin di MongoDB?
Hasil yang diharapkan adalah:
{
"_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"
}]
}
Jawaban
1 mickl Aug 19 2020 at 08:38
Pada dasarnya Anda dapat menggunakan $ reduce untuk memproses sebuah array dan mendefinisikan elemen sebelumnya menggunakan pernyataan $ let dan $ arrayElemAt . Sintaks $ set baru memungkinkan Anda menggunakan agregasi dalam pernyataan update:
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" ] ] }
]
}
}
}
}
}
}
}
])
Contoh Agregasi
Selalu Menjadi Ancaman: Mengapa Orang Berkulit Coklat dan Hitam Tidak Bisa Nyaman di Amerika Serikat
Taylor Sheridan Baru Menambahkan 1 Bintang 'Yellowstone' Favoritnya ke Pemeran 'Lawmen: Bass Reeves'