Remove an object inside a mongodb array

0

I have the following document inside a collection in mongodb:

{
    "_id" : ObjectId("5988efbb742568478c6a086f"),
    "cliente" : "[email protected]",
    "lista_compras" : [ 
        {
            "id_produto" : ObjectId("5983bb21834000b1b8e7978f"),
            "produto" : "Leite Nido em Lata 87 copos",
            "preco" : 5250,
            "imagem" : "../../images/produtos/candando/nido.jpg"
        }, 
        {
            "id_produto" : ObjectId("5983bb21834000b1b8e7978f"),
            "produto" : "Leite Nido em Lata 87 copos",
            "preco" : 5250,
            "imagem" : "../../images/produtos/candando/nido.jpg"
        }, 
        {
            "id_produto" : ObjectId("5983bb21834000b1b8e7978f"),
            "produto" : "Leite Nido em Lata 87 copos",
            "preco" : 5250,
            "imagem" : "../../images/produtos/candando/nido.jpg"
        }, 
        {
            "id_produto" : ObjectId("5983bb21834000b1b8e7978a"),
            "produto" : "Banana prata cultivada no sul de Angola 100gr",
            "preco" : 689,
            "imagem" : "../../images/produtos/candando/banana.jpg"
        }, 
        {
            "id_produto" : ObjectId("5983bb21834000b1b8e7978b"),
            "produto" : "Atum amiga de óleo vegetal",
            "preco" : 120450,
            "imagem" : "../../images/produtos/candando/atum.jpg"
        }, 
        {
            "id_produto" : ObjectId("5983bb21834000b1b8e7978a"),
            "produto" : "Banana prata cultivada no sul de Angola 100gr",
            "preco" : 689,
            "imagem" : "../../images/produtos/candando/banana.jpg"
        }, 
        {
            "id_produto" : ObjectId("5983bb21834000b1b8e7978a"),
            "produto" : "Banana prata cultivada no sul de Angola 100gr",
            "preco" : 689,
            "imagem" : "../../images/produtos/candando/banana.jpg"
        }, 
        {
            "id_produto" : ObjectId("5983bb21834000b1b8e7978a"),
            "produto" : "Banana prata cultivada no sul de Angola 100gr",
            "preco" : 689,
            "imagem" : "../../images/produtos/candando/banana.jpg"
        }
    ]
}

I want to remove one object at a time. I use the following command:

db.carrinhos.update(
    {cliente: "[email protected]"},
    {$pull: {lista_compras: { id_produto: ObjectId("5983bb21834000b1b8e7978f") }}}
)

It turns out that you delete all objects with the id specified. Is there a way I can delete one at a time?

    
asked by anonymous 09.08.2017 / 01:09

2 answers

0

I solved by adding a key value to each document within the array and was deleting it based on it. Before I had my structure like this:

{
    "_id" : ObjectId("5988efbb742568478c6a086f"),
    "cliente" : "[email protected]",
    "lista_compras" : [ 
        {
            "id_produto" : ObjectId("5983bb21834000b1b8e7978f"),
            "produto" : "Leite Nido em Lata 87 copos",
            "preco" : 5250,
            "imagem" : "../../images/produtos/candando/nido.jpg"
        }, 
        {
            "id_produto" : ObjectId("5983bb21834000b1b8e7978f"),
            "produto" : "Leite Nido em Lata 87 copos",
            "preco" : 5250,
            "imagem" : "../../images/produtos/candando/nido.jpg"
        }
}

And now I have this: (I added the key field id_produto_carrinho

{
    "_id" : ObjectId("5988efbb742568478c6a086f"),
    "cliente" : "[email protected]",
    "lista_compras" : [ 
        {
            "id_produto_carrinho" : ObjectId("598f02b2cc8bc4427823f0ee"),
            "id_produto" : ObjectId("5983bb21834000b1b8e7978f"),
            "produto" : "Leite Nido em Lata 87 copos",
            "preco" : 5250,
            "imagem" : "../../images/produtos/candando/nido.jpg"
        }, 
        {
            "id_produto_carrinho" : ObjectId("598f02b2cc8bc4427823f0ef"),
            "id_produto" : ObjectId("5983bb21834000b1b8e7978f"),
            "produto" : "Leite Nido em Lata 87 copos",
            "preco" : 5250,
            "imagem" : "../../images/produtos/candando/nido.jpg"
        }
}

When I want to delete or edit, I do it based on the key field that I added to each array.

    
14.08.2017 / 12:19
0

This is a question that has broken my head as well, plus the solution as it is always simple, rs, search the entire document for the name of your array and delete the corresponding document ID

     db.getCollection('compras').update({}, {
        $pull: { "lista_compras": { 
        "_id": ObjectId("5983bb21834000b1b8e7978a"))
         }}})
    
06.09.2018 / 22:04