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
3 Réponses :
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') } } )
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
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
.
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.
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": "" } } )
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)?