Skip to content

Commit

Permalink
[mongodb] Collection per Item (openhab#10202)
Browse files Browse the repository at this point in the history
Put Item in separate Collections

Signed-off-by: Marc <[email protected]>
  • Loading branch information
marciseli authored Mar 13, 2021
1 parent fd92f79 commit 5425e0b
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 9 deletions.
7 changes: 5 additions & 2 deletions bundles/org.openhab.persistence.mongodb/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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`.
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -117,9 +118,9 @@ public void activate(final BundleContext bundleContext, final Map<String, Object
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();
Expand Down Expand Up @@ -172,6 +173,12 @@ public void store(Item item, @Nullable String alias) {
}

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());

Expand All @@ -183,6 +190,11 @@ public void store(Item item, @Nullable String alias) {
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);
}

Expand Down Expand Up @@ -229,18 +241,44 @@ private void connectToDatabase() {
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);
throw new RuntimeException("Cannot connect to database", e);
}
}

/**
* 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
*/
Expand All @@ -267,6 +305,11 @@ public Iterable<HistoricItem> query(FilterCriteria filter) {
}

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<>();
Expand Down Expand Up @@ -315,6 +358,10 @@ public Iterable<HistoricItem> query(FilterCriteria filter) {
ZonedDateTime.ofInstant(obj.getDate(FIELD_TIMESTAMP).toInstant(), ZoneId.systemDefault())));
}

// If collection Per Item is active, disconnect after save.
if (collectionPerItem) {
disconnectFromCollection();
}
return items;
}

Expand Down

0 comments on commit 5425e0b

Please sign in to comment.