]> git.basschouten.com Git - openhab-addons.git/commitdiff
[mongodb] Collection per Item (#10202)
authorMarc <iseli_marc@hotmail.com>
Sat, 13 Mar 2021 18:48:19 +0000 (19:48 +0100)
committerGitHub <noreply@github.com>
Sat, 13 Mar 2021 18:48:19 +0000 (19:48 +0100)
Put Item in separate Collections

Signed-off-by: Marc <iseli_marc@hotmail.com>
bundles/org.openhab.persistence.mongodb/README.md
bundles/org.openhab.persistence.mongodb/src/main/java/org/openhab/persistence/mongodb/internal/MongoDBPersistenceService.java

index 23c55c5360cd666c0f46f7217326f04e12ff99a6..51a352d26a0b0ff1526187bfd93c106e4a94177f 100644 (file)
@@ -11,6 +11,9 @@ This service can be configured in the file `services/mongodb.cfg`.
 | ---------- | ------- | :------: | ---------------------------------------------------------------------------- |
 | url        |         |   Yes    | connection URL to address MongoDB.  For example, `mongodb://localhost:27017` |
 | database   |         |   Yes    | database name                                                                |
-| collection |         |   Yes    | collection name                                                              |
+| collection |         |   Yes    | set collection to "" if it shall generate a collection per item              |
 
-All item and event related configuration is done in the file `persistence/mongodb.persist`.
+If you have a username and password it looks like this: url = mongodb://[username]:[password]@[localhost]:27017/[database]
+The database is required: http://mongodb.github.io/mongo-java-driver/3.9/javadoc/com/mongodb/MongoClientURI.html
+
+All item and event related configuration is done in the file `persistence/mongodb.persist`.
\ No newline at end of file
index 6eb29f648accce0b8e126e6ab6b498a9ea74dafd..9d23d45d88e65b9fde6cf44bf54dd3b8b654ed18 100644 (file)
@@ -87,6 +87,7 @@ public class MongoDBPersistenceService implements QueryablePersistenceService {
     private @NonNullByDefault({}) String url;
     private @NonNullByDefault({}) String db;
     private @NonNullByDefault({}) String collection;
+    private boolean collectionPerItem;
 
     private boolean initialized = false;
 
@@ -117,9 +118,9 @@ public class MongoDBPersistenceService implements QueryablePersistenceService {
         collection = (String) config.get("collection");
         logger.debug("MongoDB collection {}", collection);
         if (collection == null || collection.isBlank()) {
-            logger.warn(
-                    "The MongoDB database collection is missing - please configure the mongodb:collection parameter.");
-            return;
+            collectionPerItem = false;
+        } else {
+            collectionPerItem = true;
         }
 
         disconnectFromDatabase();
@@ -172,6 +173,12 @@ public class MongoDBPersistenceService implements QueryablePersistenceService {
         }
 
         String realName = item.getName();
+
+        // If collection Per Item is active, connect to the item Collection
+        if (collectionPerItem) {
+            connectToCollection(realName);
+        }
+
         String name = (alias != null) ? alias : realName;
         Object value = this.convertValue(item.getState());
 
@@ -183,6 +190,11 @@ public class MongoDBPersistenceService implements QueryablePersistenceService {
         obj.put(FIELD_VALUE, value);
         this.mongoCollection.save(obj);
 
+        // If collection Per Item is active, disconnect after save.
+        if (collectionPerItem) {
+            disconnectFromCollection();
+        }
+
         logger.debug("MongoDB save {}={}", name, value);
     }
 
@@ -229,11 +241,14 @@ public class MongoDBPersistenceService implements QueryablePersistenceService {
         try {
             logger.debug("Connect MongoDB");
             this.cl = new MongoClient(new MongoClientURI(this.url));
-            mongoCollection = cl.getDB(this.db).getCollection(this.collection);
+            if (collectionPerItem) {
+                mongoCollection = cl.getDB(this.db).getCollection(this.collection);
+
+                BasicDBObject idx = new BasicDBObject();
+                idx.append(FIELD_TIMESTAMP, 1).append(FIELD_ITEM, 1);
+                this.mongoCollection.createIndex(idx);
+            }
 
-            BasicDBObject idx = new BasicDBObject();
-            idx.append(FIELD_TIMESTAMP, 1).append(FIELD_ITEM, 1);
-            this.mongoCollection.createIndex(idx);
             logger.debug("Connect MongoDB ... done");
         } catch (Exception e) {
             logger.error("Failed to connect to database {}", this.url);
@@ -241,6 +256,29 @@ public class MongoDBPersistenceService implements QueryablePersistenceService {
         }
     }
 
+    /**
+     * Connects to the Collection
+     */
+    private void connectToCollection(String collectionName) {
+        try {
+            mongoCollection = cl.getDB(this.db).getCollection(collectionName);
+
+            BasicDBObject idx = new BasicDBObject();
+            idx.append(FIELD_TIMESTAMP, 1).append(FIELD_ITEM, 1);
+            this.mongoCollection.createIndex(idx);
+        } catch (Exception e) {
+            logger.error("Failed to connect to collection {}", collectionName);
+            throw new RuntimeException("Cannot connect to collection", e);
+        }
+    }
+
+    /**
+     * Disconnects from the Collection
+     */
+    private void disconnectFromCollection() {
+        this.mongoCollection = null;
+    }
+
     /**
      * Disconnects from the database
      */
@@ -267,6 +305,11 @@ public class MongoDBPersistenceService implements QueryablePersistenceService {
         }
 
         String name = filter.getItemName();
+
+        // If collection Per Item is active, connect to the item Collection
+        if (collectionPerItem) {
+            connectToCollection(name);
+        }
         Item item = getItem(name);
 
         List<HistoricItem> items = new ArrayList<>();
@@ -315,6 +358,10 @@ public class MongoDBPersistenceService implements QueryablePersistenceService {
                     ZonedDateTime.ofInstant(obj.getDate(FIELD_TIMESTAMP).toInstant(), ZoneId.systemDefault())));
         }
 
+        // If collection Per Item is active, disconnect after save.
+        if (collectionPerItem) {
+            disconnectFromCollection();
+        }
         return items;
     }