MongoDB, hapus item bersarang dari objek dalam array

Sep 01 2020

Inilah struktur data saya:

db.getCollection('competitionmatches').find()
{
    "_id" : ObjectId("5d2d9eed5972a9367cd5010a"),
    "matches" : [ 
        {
            "id" : 200000,
            "utcDate" : "",
            "minute" : null,
            "homeTeam" : {
                "id" : 808,
                "coach" : {},
            },
            "goals" : [{},{}}],
        },
        {...},
        {...},
    ],
    "otherField": []
},
{...},
{...},

Apa yang saya sedang mencoba untuk menghapus adalah bidang-bidang: minute, coachdan goalsdi semua matchessemua entri dalam competitionmatches.

Saya telah mencoba yang berikut di Robo 3T dengan sukses:

db.getCollection('competitionmatches').update({}, {$unset: {"otherField":""}})

Ini menghapus dengan baik seluruh larik otherFielddi setiap elemen matchesif i pass multi:true(dihapus di sini demi keterbacaan).

Tetapi ketika saya mencoba:

db.getCollection('competitionmatches').update({}, {$unset: {"matches.$[].goals":""}})

atau

db.getCollection('competitionmatches').update({}, {$unset: {"matches.$[].minute":""}})

saya mendapatkan pesan sukses Updated 1 existing record(s) in 3mstetapi catatannya tetap sama, minuteatau goalstidak dihapus.

Saya mendapat jawaban ini dari Hapus bidang dari semua elemen dalam array di mongodb dan memperbarui versi mongo saya dari 3.4 menjadi 3.6 karena $[]diperkenalkan di 3.6 seperti yang dikatakan oleh svr dan ditampilkan di dokumen .

Tidak disetel berfungsi tetapi jalur tampaknya menjadi bagian yang salah dari pembaruan saya.

"matches.$.goals"mengembalikan kesalahan dan matches.[].goalstidak berdampak apa pun. Saya bahkan bertanya-tanya apakah mungkin ada beberapa cache tetapi itu tidak masuk akal karena unset on otherFielddijalankan dengan baik.

Saya juga ragu apakah pembaruan berjalan dengan baik tetapi aplikasi yang menggunakan database berfungsi dengan baik sejauh yang saya bisa lihat.

Jawaban

turivishal Sep 01 2020 at 20:09

Pembaruan tidak dapat mengakses bidang array langsung menggunakan $atau $[], kita perlu menyediakan kueri untuk mencocokkan dalam array,

db.getCollection('competitionmatches').update(
  // it requires to specify any one field match condition in query part
  { "matches.goals": { $exists: true } }, { $unset: { 
      "matches.$[].minute": true // pass true "matches.$[].homeTeam.coach": true // pass true
      "matches.$[].goals": true // pass true
    } 
  } 
);

Kulit mongo

> db.upd22.find()
[
  {
    _id: ObjectId("5d2d9eed5972a9367cd5010a"),
    matches: [
      {
        id: 200000,
        utcDate: '',
        minute: null,
        homeTeam: { id: 808, coach: {} },
        goals: [ {}, {} ]
      },
      {
        id: 300000,
        utcDate: '',
        minute: null,
        homeTeam: { id: 808, coach: {} },
        goals: [ {}, {} ]
      }
    ]
  },
  {
    _id: ObjectId("5d2d9eed5972a9367cd5010b"),
    matches: [
      {
        id: 400000,
        utcDate: '',
        minute: null,
        homeTeam: { id: 808, coach: {} },
        goals: [ {}, {} ]
      },
      {
        id: 500000,
        utcDate: '',
>                                                                                                                                          homeTeam: { id: 808, coach: {} },
        goals: [ {}, {} ]
      }
    ]
  }
]
> db.getCollection('upd22').update(
...     { "matches.goals": { $exists: true } },
...     {
.....         $unset: { ....... "matches.$[].minute": true,
.......             "matches.$[].goals": true
.......         }
.....     },
...     { multi: false }
... )
{
  acknowledged: 1,
  insertedId: null,
  matchedCount: 1,
  modifiedCount: 1,
  upsertedCount: 0
}
> db.upd22.find()
[
  {
    _id: ObjectId("5d2d9eed5972a9367cd5010a"),
    matches: [
      { id: 200000, utcDate: '', homeTeam: { id: 808, coach: {} } },
      { id: 300000, utcDate: '', homeTeam: { id: 808, coach: {} } }
    ]
  },
  {
    _id: ObjectId("5d2d9eed5972a9367cd5010b"),
    matches: [
      {
        id: 400000,
        utcDate: '',
        minute: null,
        homeTeam: { id: 808, coach: {} },
        goals: [ {}, {} ]
      },
      {
        id: 500000,
        utcDate: '',
        minute: null,
        homeTeam: { id: 808, coach: {} },
        goals: [ {}, {} ]
      }
    ]
  }
]
>