feat(dbmongo): upsert option for set_one 98/10198/3
authorbravof <fbravo@whitestack.com>
Fri, 15 Jan 2021 14:54:45 +0000 (11:54 -0300)
committersousaedu <eduardo.sousa@canonical.com>
Wed, 10 Feb 2021 15:14:05 +0000 (16:14 +0100)
Change-Id: I3dd38738e7ef8c1b70df7742d08eb8f8d52529e1
Signed-off-by: bravof <fbravo@whitestack.com>
osm_common/dbmongo.py

index 56f387b..7fc29dc 100644 (file)
@@ -363,13 +363,13 @@ class DbMongo(DbBase):
             raise DbException(e)
 
     def set_one(self, table, q_filter, update_dict, fail_on_empty=True, unset=None, pull=None, push=None,
-                push_list=None, pull_list=None):
+                push_list=None, pull_list=None, upsert=False):
         """
         Modifies an entry at database
         :param table: collection or table
         :param q_filter: Filter
         :param update_dict: Plain dictionary with the content to be updated. It is a dot separated keys and a value
-        :param fail_on_empty: If nothing matches filter it returns None unless this flag is set tu True, in which case
+        :param fail_on_empty: If nothing matches filter it returns None unless this flag is set to True, in which case
         it raises a DbException
         :param unset: Plain dictionary with the content to be removed if exist. It is a dot separated keys, value is
                       ignored. If not exist, it is ignored
@@ -380,6 +380,8 @@ class DbMongo(DbBase):
                      is appended to the end of the array
         :param push_list: Same as push but values are arrays where each item is and appended instead of appending the
                           whole array
+        :param upsert: If this parameter is set to True and no document is found using 'q_filter' it will be created.
+                     By default this is false.
         :return: Dict with the number of entries modified. None if no matching is found.
         """
         try:
@@ -399,7 +401,7 @@ class DbMongo(DbBase):
 
             with self.lock:
                 collection = self.db[table]
-                rows = collection.update_one(self._format_filter(q_filter), db_oper)
+                rows = collection.update_one(self._format_filter(q_filter), db_oper, upsert=upsert)
             if rows.matched_count == 0:
                 if fail_on_empty:
                     raise DbException("Not found any {} with filter='{}'".format(table[:-1], q_filter),