From 89fcefdb7c30860554921057de8dde40f750eabe Mon Sep 17 00:00:00 2001 From: Marc Date: Sat, 13 Mar 2021 19:48:19 +0100 Subject: [PATCH] [mongodb] Collection per Item (#10202) Put Item in separate Collections Signed-off-by: Marc --- .../org.openhab.persistence.mongodb/README.md | 7 ++- .../internal/MongoDBPersistenceService.java | 61 ++++++++++++++++--- 2 files changed, 59 insertions(+), 9 deletions(-) diff --git a/bundles/org.openhab.persistence.mongodb/README.md b/bundles/org.openhab.persistence.mongodb/README.md index 23c55c5360..51a352d26a 100644 --- a/bundles/org.openhab.persistence.mongodb/README.md +++ b/bundles/org.openhab.persistence.mongodb/README.md @@ -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 diff --git a/bundles/org.openhab.persistence.mongodb/src/main/java/org/openhab/persistence/mongodb/internal/MongoDBPersistenceService.java b/bundles/org.openhab.persistence.mongodb/src/main/java/org/openhab/persistence/mongodb/internal/MongoDBPersistenceService.java index 6eb29f648a..9d23d45d88 100644 --- a/bundles/org.openhab.persistence.mongodb/src/main/java/org/openhab/persistence/mongodb/internal/MongoDBPersistenceService.java +++ b/bundles/org.openhab.persistence.mongodb/src/main/java/org/openhab/persistence/mongodb/internal/MongoDBPersistenceService.java @@ -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 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; } -- 2.47.3