2017-09-26 5 views
0

J'utilise mongo de findOneAndReplace() avec upsert = true et returnNewDocument = trueMongoDB findOneAndReplace journal si ajouté comme nouveau document ou remplacé

comme essentiellement un moyen de ne pas insérer double. Mais je veux que le _id du nouveau document inséré (ou l'ancien document existant) soit passé à une tâche de traitement en arrière-plan. MAIS je veux aussi me connecter si le document a été ajouté comme nouveau ou si un remplacement a eu lieu.

Je ne vois aucun moyen d'utiliser findOneAndReplace() avec ces paramètres et répondre à cette question.

La seule chose à laquelle je peux penser est de trouver et d'insérer deux demandes différentes, ce qui semble un peu contre-productif.

ps. J'utilise actuellement le find_one_and_replace() de pymongo mais il semble identique à la fonction JS mongo.

EDIT: édité pour clarification.

+0

Avec le retour d'un nouveau document n'obtenez-vous pas le document remplacé? Vous devriez être en mesure d'obtenir le _id du document remplacé. Peut-être que je ne comprends pas la question? – JavaProgrammer12

+0

J'ai besoin de LOG si le document a été ajouté comme nouveau ou si un remplacement est survenu. J'utilise findOneAndReplace parce que mon script d'ajout devient idempotetent mais je suis toujours curieux de connaître les nouvelles choses qui sont ajoutées. – mtourne

Répondre

1

est-il pas possible d'utiliser la fonction de replace_one? En Java, je suis capable d'utiliser repalceOne qui retourne UpdateResult. Cela a une méthode pour trouver si documenté mis à jour ou non. Je vois repalce_one dans pymongo et il devrait se comporter de même. Voici doc PyMongo Doc Rechercher replace_one

0

La façon dont je vais la mettre en œuvre pour l'instant (en python):

import pymongo 

def find_one_and_replace_log(collection, find_query, 
          document_data, 
          log={}): 
    ''' behaves like find_one_or_replace(upsert=True, 
    return_document=pymongo.ReturnDocument.AFTER) 
    ''' 
    is_new = False 
    document = collection.find_one(find_query) 
    if not document: 
     # document didn't exist 
     # log as NEW 
     is_new = True 
    new_or_replaced_document = collection.find_one_and_replace(
     find_query, 
     document_data, 
     upsert=True, 
     return_document=pymongo.ReturnDocument.AFTER 
    ) 
    log['new_document'] = is_new 
    return new_or_replaced_document