59 votes

Comment supprimer un élément d'un tableau à double emboîtement dans un document MongoDB.

J'ai une structure de document qui ressemble à peu près à ce qui suit :

{
"_id" : "777",
"someKey" : "someValue",
"someArray" : [
    {
        "name" : "name1",
        "someNestedArray" : [
            {
                "name" : "value"
            },
            {
                "name" : "delete me"
            }
        ]
    }
  ]
}

Je veux supprimer l'élément du tableau imbriqué avec la valeur "supprimez-moi".

Je sais que je peux trouver des documents qui correspondent à cette description en utilisant des expressions $elemMatch imbriquées. Quelle est la syntaxe de la requête permettant de supprimer l'élément en question ?

21voto

Cuong Le Ngoc Points 8001

Ajout de MongoDB 3.6 $[] qui facilite les mises à jour des tableaux qui contiennent des documents intégrés. Le problème peut donc être résolu par :

db.test.update(
  { _id : "777" },
  {$pull : {"someArray.$[].someNestedArray" : {"name":"delete me"}}}
)

12voto

Aryeh Armon Points 1315

Comme l'a commenté @Melkor (qui devrait probablement être une réponse en soi),

Si vous ne connaissez pas l'indice, utilisez :

    {_id: TheMainID, "theArray._id": TheArrayID}, {$pull: 
    {"theArray.$.theNestedArray": {_id: theNestedArrayID}}}

6voto

Sepp Renfer Points 111

À partir de MongoDB 3.6, vous pouvez utiliser la fonction arrayFilters pour le faire :

db.test.update(
  { _id: "777" }, 
  { $pull: { "someArray.$[elem].someNestedArray": { name: "delete me" } } },
  { arrayFilters: [{ "elem.name": "name1"}] }
)

voir aussi https://docs.mongodb.com/manual/reference/operator/update/positional-filtered/index.html#update-all-documents-that-match-arrayfilters-in-an-array

3voto

rafiquenazir Points 138

Un autre exemple et une autre utilisation pourraient être les suivants :

{

    "company": {
        "location": {
            "postalCode": "12345",
            "Address": "Address1",
            "city": "Frankfurt",
            "state": "Hessen",
            "country": "Germany"
        },
        "establishmentDate": "2019-04-29T14:12:37.206Z",
        "companyId": "1",
        "ceo": "XYZ"
    },
    "items": [{
            "name": "itemA",
            "unit": "kg",
            "price": "10"
        },
        {
            "name": "itemB",
            "unit": "ltr",
            "price": "20"
        }

    ]
}
  1. DELETE : Requête Mongodb pour supprimer ItemB :

    db.getCollection('test').update(
    {"company.companyId":"1","company.location.city":"Frankfurt"}, {$pull : {"items" : {"name":"itemB"}}} )

  2. FIND : Recherche de la requête pour l'élémentB :

    db.getCollection('test').find( {"company.companyId":"1","company.location.city":"Frankfurt","items.name":"itemB"}, { "items.$": 1 } )

3.UPDATE : requête de mise à jour de l'élémentB :

db.getCollection('test').update
(
 {"company.companyId":"1","company.location.city":"Frankfurt","items.name":"itemB"},
 { $set: { "items.$[].price" : 90 }}, 
   { multi: true });

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X