Dans l'exemple suivant, supposons que le document se trouve dans la collection db.people .
Comment supprimer le 3ème élément du tableau des intérêts par son index ?
{
"_id" : ObjectId("4d1cb5de451600000000497a"),
"name" : "dannie",
"interests" : [
"guitar",
"programming",
"gadgets",
"reading"
]
}
Voici ma solution actuelle:
var interests = db.people.findOne({"name":"dannie"}).interests;
interests.splice(2,1)
db.people.update({"name":"dannie"}, {"$set" : {"interests" : interests}});
Y a-t-il un moyen plus direct?
Réponses:
Il n'y a pas de moyen simple de tirer / supprimer par index de tableau. En fait, il s'agit d'un numéro ouvert http://jira.mongodb.org/browse/SERVER-1014 , vous pouvez voter pour.
La solution de contournement utilise $ unset puis $ pull:
Mise à jour: comme mentionné dans certains commentaires, cette approche n'est pas atomique et peut provoquer des conditions de concurrence si d'autres clients lisent et / ou écrivent entre les deux opérations. Si nous avons besoin que l'opération soit atomique, nous pourrions:
la source
Vous pouvez utiliser un
$pull
modificateur d'update
opération pour supprimer un élément particulier d'un tableau. Dans le cas où vous avez fourni une requête ressemblera à ceci:Vous pouvez également envisager d'utiliser
$pullAll
pour supprimer toutes les occurrences. Plus d'informations à ce sujet sur la page de documentation officielle - http://www.mongodb.org/display/DOCS/Updating#Updating-%24pullCela n'utilise pas l'index comme critère de suppression d'un élément, mais peut toujours aider dans des cas similaires au vôtre. IMO, l'utilisation d'index pour adresser des éléments à l'intérieur d'un tableau n'est pas très fiable car mongodb n'est pas cohérent sur un ordre d'éléments aussi fas que je le sais.
la source
Plutôt que d'utiliser unset (comme dans la réponse acceptée), je résous ce problème en définissant le champ sur une valeur unique (c'est-à-dire non NULL), puis en tirant immédiatement cette valeur. Un peu plus sûr du point de vue asynchrone. Voici le code:
Espérons que mongo résoudra ce problème, peut-être en étendant le modificateur $ position pour prendre en charge $ pull ainsi que $ push.
la source
Je recommanderais d'utiliser un champ GUID (j'ai tendance à utiliser ObjectID), ou un champ auto-incrémenté pour chaque sous-document du tableau.
Avec ce GUID, il est facile d'émettre un $ pull et de s'assurer que le bon sera extrait. Il en va de même pour les autres opérations sur les tableaux.
la source
À partir de
Mongo 4.4
, le$function
opérateur d'agrégation permet d'appliquer une fonction javascript personnalisée pour implémenter un comportement non pris en charge par le langage de requête MongoDB.Par exemple, pour mettre à jour un tableau en supprimant un élément à un index donné:
$function
prend 3 paramètres:body
, qui est la fonction à appliquer, dont le paramètre est le tableau à modifier. La fonction ici consiste simplement à utiliser splice pour supprimer 1 élément à l'index 2.args
, qui contient les champs de l'enregistrement que labody
fonction prend comme paramètre. Dans notre cas"$interests"
.lang
, qui est la langue dans laquelle labody
fonction est écrite. Seulementjs
est actuellement disponible.la source
dans Mongodb 4.2, vous pouvez faire ceci:
P est l'index de l'élément que vous souhaitez supprimer du tableau.
Si vous souhaitez supprimer de P jusqu'à la fin:
la source
Pour les personnes qui recherchent une réponse en utilisant mangouste avec nodejs. Voilà comment je fais.
Je peux réécrire cette réponse si elle ne comprend pas très bien, mais je pense que ça va.
J'espère que cela vous aidera, j'ai perdu beaucoup de temps face à ce problème.
la source
Au lieu d'utiliser $ pull, nous pouvons utiliser $ pop pour supprimer des éléments d'un tableau par son index. Mais vous devez soustraire 1 de la position d'index pour supprimer en fonction de l'index.
Par exemple, si vous souhaitez supprimer l'élément de l'index 0, vous devez utiliser -1, pour l'index 1, vous devez utiliser 0 et ainsi de suite ...
Requête pour supprimer le 3e élément (gadgets):
db.people.update({"name":"dannie"}, {'$pop': {"interests": 1}})
pour référence: https://docs.mongodb.com/manual/reference/operator/update/pop/
la source
$pop
ne peut supprimer que le premier ou le dernier élément du tableau. La requête de cette réponse ne supprime pas le troisième élément.