2.3 Integration with MongoDB databases

Note: This example is deprecated for the latest versions of signac and signac-flow.

Instead of storing the index in a variable or in a plain-text file, we could export it to any tool of our choice. For convenience, signac provides export routines for MongoDB database collections.

Please note: The following steps require pymongo and either a local MongoDB instance or a signac database configuration.

[1]:
import signac

#
# --- PLEASE UNCOMMENT ONE OF THE FOLLOWING TWO CONFIGURATIONS ---
#

# --- 1) USING A LOCAL MONGODB INSTANCE ---
# from pymongo import MongoClient
# client = MongoClient()
# db = client.testing

# --- 2) USING A SIGNAC DATABASE CONFIGURATION ---
# db = signac.get_database('testing')

# index = db.signac_tutorial_index
# index.drop()
# master_index = db.signac_tutorial_master_index
# master_index.drop()

We can export either the project index directly via:

[2]:
# project = signac.get_project(root='projects/tutorial')

# signac.export(project.index(), index)

Or we compile and export a master index:

[3]:
# signac.export(signac.index(), master_index, update=True)

In both cases we can now use MongoDB’s query engine for advanced search queries. For example, let’s find the mean gas volume of water for the pressure range (2.0 < p <= 5.0):

[4]:
# import numpy as np

# query = {
#    '$and': [{'statepoint.p': {'$gt': 2.0}}, {'statepoint.p': {'$lte': 5.0}}],
#    'fluid': 'water',
#    'V_gas': {'$exists': True}}
# docs = master_index.find(query)
# V = np.array([doc['V_gas'] for doc in docs])
# print(V.mean())