Mongodb upsert ne met à jour que les champs sélectionnés, mais insère tout

Je suis en train d'utiliser upsert dans MongoDB pour mettre à jour un champ dans un document s'il est trouvé OU l'insertion d'un tout nouveau document avec beaucoup de champs. Le problème est qu'il me semble que MongoDB remplace chaque champ ou insère un sous-ensemble de champs dans son upsert opération, c'est à dire qu'il ne peut pas insérer plus de champs qu'il veut réellement mettre à jour.

Ce que je veux faire est la suivante:

  • J'ai une requête pour une seule et unique valeur
  • Si un document existe déjà, seulement une valeur d'horodatage (permet de l'appeler "lastseen') est mise à jour à une nouvelle valeur
  • Si un document n'existe pas, je vais l'ajouter à une longue liste de paires clé/valeur qui doit rester statique pour le reste de sa durée de vie.

Permet de l'illustrer:

L'exemple, à partir de ma compréhension de la mise à jour de la "lastseen' date 'nom' est trouvé, mais si 'nom' n'est pas trouvé, il ne serait d'insérer le nom de' + 'lastseen'.

db.somecollection.update({name: "some name"},{ $set: {"lastseen": "2012-12-28"}}, {upsert:true})

Si j'ai ajouté plus de champs (des paires clé/valeur) à la deuxième argument et de la baisse du $set, puis chaque champ sera remplacé sur la mise à jour, mais elle aurait l'effet désiré sur insérer. Est-il quelque chose comme $insert ou similaire pour effectuer des opérations uniquement lors de l'insertion?

Il me semble donc que je ne peux obtenir l'une des opérations suivantes:

  • Le bon comportement de mise à jour, mais serait d'insérer un document avec seulement un sous-ensemble des champs souhaités si le document n'existe pas
  • La bonne insertion de comportement, mais serait alors de remplacer tous les champs existants si le document existe déjà

Sont ma compréhension correcte? Si oui, est-ce possible pour résoudre en une seule opération?

source d'informationauteur agnsaft