1
votes

Comment supprimer une ligne d'un tableau dans la collection mongoDB

J'ai une collection de requêtes, sa structure ressemble à ceci

WriteResult({
    "nMatched" : 0,
    "nUpserted" : 0,
    "nModified" : 0,
    "writeError" : {
        "code" : 28,
        "errmsg" : "Cannot use the part (_id) of (QUERIES._id) to traverse the element"
})

Je veux supprimer le premier élément du tableau QUERIES. Sortie attendue

db.getCollection("query_masters").update( {'QUERIES._id':ObjectId('5e726996b96d107eac5c88a4')},{$pull: { 'QUERIES._id': ObjectId('5e726996b96d107eac5c88a4') }}
        )

J'ai essayé avec la méthode de mise à jour suivante mais j'ai eu une erreur lors de l'exécution de la méthode de mise à jour sur mongoDB Shell

{
        "_id": "5e71fa3ab004192b349e4a06",
        "QUERIES": [
            {
                "_id": "5e71fa46b004192b349e4a08",
                "QUERY": "2",
                "USER_ID": "5e6f1c5b8451307f782d0994",
                "USER_NAME": "a2",
                "createdAt": "2020-03-18T10:39:02.451Z"
            }
        ],
        "TICKET_ID": "5e70f4fa47df9479502f7937",
        "USER_ID": "5e6f1c5b8451307f782d0994",
        "RESOLVED_DATE": "2020-03-07T00:00:00.000Z"
    }

Message d'erreur

{
        "_id": "5e71fa3ab004192b349e4a06",
        "QUERIES": [
            {
                "_id": "5e71fa3ab004192b349e4a07",
                "QUERY": "1",
                "USER_ID": "5e6f1c5b8451307f782d0994",
                "USER_NAME": "a1",
                "createdAt": "2020-03-18T10:38:50.247Z"
            },
            {
                "_id": "5e71fa46b004192b349e4a08",
                "QUERY": "2",
                "USER_ID": "5e6f1c5b8451307f782d0994",
                "USER_NAME": "a2",
                "createdAt": "2020-03-18T10:39:02.451Z"
            }
        ],
        "TICKET_ID": "5e70f4fa47df9479502f7937",
        "USER_ID": "5e6f1c5b8451307f782d0994",
        "RESOLVED_DATE": "2020-03-07T00:00:00.000Z"
    }

-Merci d'avance


1 commentaires

Aimez-vous supprimer le premier élément du tableau QUERIES ou l'élément avec _id = 5e726996b96d107eac5c88a4 (qui n'existe pas du tout de toute façon)?


3 Réponses :


0
votes

Une erreur signifie que vous ne pouvez pas sous-identifier l'ID de document pour parcourir les principaux documents de la collection. Donc, pour éviter cela, vous pouvez traverser en utilisant le _id du document parent.

Essayez cette requête:

db
.getCollection("query_masters")
.update(
    {
         "QUERIES": {
             $elemMatch: {
                 _id: ObjectId('5e726996b96d107eac5c88a4')
             }
         }
    },
    {
        $pull: {
            'QUERIES._id': ObjectId('5e726996b96d107eac5c88a4')
        }
    }
)

Si vous souhaitez toujours parcourir le document en utilisant l'identifiant du sous-document essayez ceci:

db
.getCollection("query_masters")
.update(
    {
        '_id':ObjectId('5e71fa3ab004192b349e4a06')
    },
    {
        $pull: {
            'QUERIES._id': ObjectId('5e726996b96d107eac5c88a4')
        }
    }
)


3 commentaires

obtenir la même erreur Impossible d'utiliser la partie (_id) de (QUERIES._id) pour traverser l'élément


@vijaykrishnavanshi vous utilisez ObjectId mais @Sufil n'a pas mentionné qu'il s'agit d'un ObjectId. Au lieu de cela, il ne mentionne que _id donc, cela cause le problème.


@vijaykrishnavanshi désolé pour ça, j'utilise ObjectId



0
votes

J'ai d'abord inséré des données dans ma collection nommée Employee , puis j'écris la requête sous la forme:

db.Employee.update({'_id':("5e71fa3ab004192b349e4a06")}, 
                   {$pull:{"QUERIES": {USER_NAME:"a1"}}},false, true
                  );

Les valeurs booléennes sont upsert et multi que vous pouvez consulter dans la documentation. Et je veux juste vous suggérer d'utiliser ObjectId à votre _id au-dessus de QUERIES array .


2 commentaires

Veuillez ne pas coller d'images, utilisez plutôt du texte formaté.


Cela ne supprime pas le "premier" élément. Il supprime l'élément où USER_NAME = "a1" quelle que soit sa position dans le tableau.



0
votes

Votre exigence n'est pas claire.

Si vous souhaitez supprimer le premier élément quel que soit le contenu, la solution est

db.collection.updateMany(
   {},
   { $pull: { "QUERIES": { QUERY: "1" } } }
)

db.collection.updateMany(
   {},
   { $pull: { "QUERIES": { USER_ID: ObjectId("5e6f1c5b8451307f782d0994") } } }
)

db.collection.updateMany(
   {},
   { $pull: { "QUERIES": { _id: ObjectId("5e6f1c5b8451307f782d0994") } } }
)

db.collection.updateMany(
   {},
   { $pull: { "QUERIES": { USER_NAME: "a1" } } }
)

Si la position dans le tableau n'est pas pertinente, la solution est l'une de celles-ci:

db.collection.updateMany(
   {},
   { $unset: { "QUERIES.0": "" } }
)


0 commentaires