Как удалить весь вложенный массив

#arrays #mongodb #mongoose

#массивы #mongodb #мангуст

Вопрос:

В моей базе данных MongoDB у меня есть коллекция «produits» с такими документами

 {
    "_id": {
        "$oid": "6048e97b4a5f000096007505"
    },
    "modeles": [
        {
            "id": "OppoA3",
            "pieces": [
                {
                "id": "OppoA3avn"      
                },
                {
                 "id": "OppoA3bat"      
                }]
            ]
        }, 
        {
            "id": "OppoA1",
            "pieces": [
                {
                "id": "OppoA1avn",
                },
                {
                "id": "OppoA1batt",
                }
            ]
        }
    ]
}
 

Как я могу удалить все modeles.pieces из всех моих документов.

Мне удалось удалить с помощью фильтра на modeles.id но с этим кодом, но не во всей коллекции

 db.produits.update(
    {marque_id:'OPPO', 'modeles.id':'RENOZ'},
    {$set:
        {
            'modeles.$.pieces': []
        }
    }
    , { multi : true }
)
 

Я бы хотел, чтобы все документы, подобные этому, наконец

 {
    "_id": {
        "$oid": "6048e97b4a5f000096007505"
    },
    "modeles": [
        {
            "id": "OppoA3",
            "pieces": []
        }, 
        {
            "id": "OppoA1",
            "pieces": []
        }
    ]
}
 

Спасибо за вашу помощь.

Ответ №1:

Я выполнил цикл javascript, подобный этому, но я думаю, что это не лучшая практика

  async removePieces(){
    var doc
    try {
      doc =  await produitModel.find()
      for (var produit of doc) {
        for (var modele of produit.modeles) {
          const filter = {'marque_id': produit.marque_id, 'modeles.id': modele.id}
          const set = {
                        $set: {
                          'modeles.$.pieces': []
                        }
                      }

          await db.collection('produits').updateOne(filter, set)
        }
      }
      console.log('removePieces() ==> Terminé')
    } catch(err) {
      console.log(err)
    }
  }
 

Ответ №2:

     db.produits.update({
      modeles: {//This is because your second document will create failure otherwise
        $exists: true
      }
    },
    {
      $set: {
        "modeles.$.pieces": []
      }
    },
    {
      multi: true
    })
 

Комментарии:

1. Я пытался, но это невозможно Error : The positional operator did not find the match needed from the query.

2. конечно, вам просто нужно сбросить его в пустой массив. Протестируйте эту логику, убедившись, что она соответствует вашим потребностям.

3. Ошибка еще не произошла "code" : 28, "errmsg" : "Cannot create field 'pieces' in element {modeles: [

4. Пожалуйста, добавьте некоторые пояснения к вашему ответу, чтобы другие могли извлечь из него уроки

5. Я обновляю свой вопрос редактирования, потому что мой примерный документ был плохо отформатирован