Ubah beberapa array menjadi satu array di MongoDB, hapus juga nilai Tidak Ada dari Array

Nov 09 2020

Struktur Array Mongo DB:

{

    "time" :[
           [2018-12-18T20:16:28.800Z , 2018-12-18T20:16:28.800Z, 2016-11-14T10:16:32.700Z],
           [2016-11-14T10:16:32.700Z, 2017-09-17T11:16:54.500Z, 2018-12-18T20:16:28.800Z],
           [2017-09-17T11:16:54.500Z, 2018-12-18T20:16:28.800Z, 2016-11-14T10:16:32.700Z]
],
    "bar": [
           [2,5,9,8],
           [6,3,7,None],
           [7,8,None]
    ]
}

Output yang diharapkan dengan satu larik tanpa nilai None:

"time" :[
2018-12-18T20:16:28.800Z, 
2018-12-18T20:16:28.800Z, 
2016-11-14T10:16:32.700Z,
2016-11-14T10:16:32.700Z, 
2017-09-17T11:16:54.500Z, 
2017-09-17T11:16:54.500Z, 
2016-11-14T10:16:32.700Z
],
    "bar": [
           2,
           5,
           9,
           6,
           3,
           7,
           8
]
}

Saya menggunakan Mongodb 4.2, dan ingin mengubah beberapa array menjadi satu array, tanpa $unwind. Karena itu mengurangi kinerja dalam kasus saya.

Jawaban

1 turivishal Nov 09 2020 at 08:37

Anda dapat mencoba,

  • waktu, $reduceuntuk mengulang perulangan waktu dan $concatArraysmenggabungkan array
  • bar, $reduceuntuk mengulang loop dari bar dan $concatArraysuntuk menggabungkan array dan mendapatkan nilai unik, $filteruntuk mengulang loop dari array yang diperbarui dari $reducedan menghapus Nonenilai dari array itu
db.collection.aggregate([
  {
    $project: { time: { $reduce: {
          input: "$time", initialValue: [], in: { $concatArrays: ["$$value", "$$this"] }
        }
      },
      bar: {
        $filter: { input: { $reduce: {
              input: "$bar", initialValue: [], in: { $concatArrays: ["$$value", "$$this"] }
            }
          },
          cond: { $ne: ["$$this", "None"] }
        }
      }
    }
  }
])

Tempat bermain