5 votes

Supprimer un élément d'un tableau dans mongodb

Je suis nouveau dans mongodb et je veux supprimer un élément du tableau.

mon document est le suivant

{
  "_id" : ObjectId("4d525ab2924f0000000022ad"), 
  "name" : "hello", 
  "time" : [
      {
              "stamp" : "2010-07-01T12:01:03.75+02:00",
              "reason" : "new"
      },
      {
              "stamp" : "2010-07-02T16:03:48.187+03:00",
              "reason" : "update"
      },
      {
              "stamp" : "2010-07-02T16:03:48.187+04:00",
              "reason" : "update"
      },
      {
              "stamp" : "2010-07-02T16:03:48.187+05:00",
              "reason" : "update"
      },
      {
              "stamp" : "2010-07-02T16:03:48.187+06:00",
              "reason" : "update"
      }
  ]
}

Dans le document, je veux supprimer le premier élément (reason:new) et le dernier élément (06:00).

et je veux le faire en utilisant mongoquery, je n'utilise pas de pilote java/php.

6voto

asleepysamurai Points 816

Si je comprends bien, vous voulez supprimer le premier et le dernier élément du tableau si la taille du tableau est supérieure à 3. Vous pouvez le faire en utilisant la requête findAndModify. Dans le shell mongo, vous utiliserez cette commande :

db.collection.findAndModify({
    query: { $where: "this.time.length > 3" },
    update: { $pop: {time: 1}, $pop: {time: -1} },
    new: true
});

Cela permet de trouver le document de votre collection qui correspond à la clause $where. Le champ $where vous permet de spécifier toute méthode javascript valide. Veuillez noter que la mise à jour ne s'applique qu'au premier document trouvé.

Vous pouvez également consulter les documents suivants :

  1. http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-JavascriptExpressionset%7B%7B%24où%7D%7D pour en savoir plus sur la clause $where.
  2. http://www.mongodb.org/display/DOCS/Updating#Updating-%24pop pour plus sur $pop.
  3. http://www.mongodb.org/display/DOCS/findAndModify+Commande pour plus sur findAndModify.

4voto

gnarf Points 49213

Vous pourriez le mettre à jour avec { $pop: { time: 1 } } pour supprimer le dernier, et { $pop: { time : -1 } } pour enlever le premier. Il y a probablement une meilleure façon de procéder.

0voto

Bob Points 181

@javaamtho vous ne pouvez pas tester pour une taille supérieure à 3 mais seulement si c'est exactement 3, pour une taille supérieure à un nombre x vous devez utiliser la fonction $inc et disposez d'un champ auquel vous attribuez soit 1 soit -1 afin de garder une trace lorsque vous supprimez ou ajoutez des éléments (utilisez un champ distinct en dehors du tableau comme ci-dessous, time_count).

{
  "_id" : ObjectId("4d525ab2924f0000000022ad"), 
  "name" : "hello",
  "time_count" : 5,
  "time" : [
      {
              "stamp" : "2010-07-01T12:01:03.75+02:00",
              "reason" : "new"
      },
      {
              "stamp" : "2010-07-02T16:03:48.187+03:00",
              "reason" : "update"
      },
      {
              "stamp" : "2010-07-02T16:03:48.187+04:00",
              "reason" : "update"
      },
      {
              "stamp" : "2010-07-02T16:03:48.187+05:00",
              "reason" : "update"
      },
      {
              "stamp" : "2010-07-02T16:03:48.187+06:00",
              "reason" : "update"
      }
  ]
}

0voto

42n4 Points 440

Si vous souhaitez laisser ces éléments de temps, vous pouvez utiliser la commande aggregate de mongo 2.2+ pour récupérer les éléments de temps min et max, annuler tous les éléments de temps, et pousser les versions min et max (avec quelques modifications, cela pourrait faire votre travail) :

smax=db.collection.aggregate([{$unwind: "$time"},
{$project: {tstamp:"$time.stamp",treason:"$time.reason"}},
{$group: {_id:"$_id",max:{$max: "$tstamp"}}},
{$sort: {max:1}}])

smin=db.collection.aggregate([{$unwind: "$time"},
{$project: {tstamp:"$time.stamp",treason:"$time.reason"}},
{$group: {_id:"$_id",min:{$min: "$tstamp"}}},
{$sort: {min:1}}])

db.students.update({},{$unset: {"scores": 1}},false,true)

smax.result.forEach(function(o)  
{db.collection.update({_id:o._id},{$push:
{"time": {stamp: o.max ,reason: "new"}}},false,true)})

smin.result.forEach(function(o)
{db.collection.update({_id:o._id},{$push:
{"time": {stamp: o.min ,reason: "update"}}},false,true)})

0voto

user2859713 Points 1

db.collection.findAndModify({ query : {$where : "this.time.length > 3"}, update : {$pop : {time : 1}, $pop{time : -1}}, new : true }) ;

convertir en PHP

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X