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
Vous devez vous connecter pour publier un commentaire.
MongoDB 2.4 a
$setOnInsert
Il y a une demande de fonctionnalité pour cette ( https://jira.mongodb.org/browse/SERVER-340 ) qui est résolu dans le paragraphe 2.3. Bizarre les rejets sont en fait des dev libère donc ce sera dans la 2.4 stable.
Donc il n'y a aucun moyen réel dans le courant des versions stables pour ce faire encore. Je crains que la seule méthode c'est de le faire 3 requêtes conditionnelles atm: 1 pour vérifier la ligne, puis un
if
d'insertion ou de mise à jour.Je suppose que si vous aviez des problèmes avec la serrure, vous pouvez le faire fonctionner avec du JS mais c'est mal cependant, il serait verrouiller cette mise à jour à un seul thread.