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
QUERIESou l'élément avec_id = 5e726996b96d107eac5c88a4(qui n'existe pas du tout de toute façon)?