Mongo Db¶
Overview¶
You dont need to create users / passwords / dbs or tables just use it
Programming language is Javascript
List all databases¶
show dbs
Connect to a db¶
use <db>
List all collections¶
show collections
Insert data¶
db.<collection>.save({name: "wurst", firstname: "hans"})
Import in json format
cat json_file | /usr/bin/mongoimport --type json -d mydb -c mycollection
Select from collection¶
all
db.<collection>.find()
filter by field
db.<collection>.find(field: "value")
filter by regexp
db.<collection>.find(field: /\d+/)
select specific fields
db.<collection>.find({},{"field_to_select": 1})
Iterate over all results¶
var cursor = db.<collection>.find();
while (cursor.hasNext()) printjson(cursor.next());
Or better
db.<collection>.find().forEach(printjson)
Sorting¶
Lowest first
db.<collection>.find().sort({"field": 1})
Highest first
db.<collection>.find().sort({"field": -1})
Update data¶
db.<collection>.update({"_id": 1}, {$set: {"field": "new value"}})
Delete data¶
Remove complete collection
db.<collection>.drop()
Remove some entries
db.<collection>.remove({"name": "wurst"})
Delete a field
db.<collection>.update({“_id”: 1}, {$unset: {“field”: “”}})
Delete whole database
db.dropDatabase()
Working with timestamps¶
Get all entries from 1.12. till 6.12.
db.snmp.find({'time': {'$gt': ISODate('2012-12-01T00:00:00'), '$lt': ISODate("2012-12-05T23:59:59")}})
Select distinct values¶
db.<collection>.distinct('field')
Create index on collection field¶
sparse will only create index if a value for that field exists
db.<collection>.ensureIndex( { myfield: 1 }, {sparse: true, background: true} );
Unique constraint
db.<collection>.ensureIndex( { myfield: 1 }, {unique: true} );
Show indexes¶
Of collection
db.<collection>.getIndexes()
All
db.system.indexes.find()
Using references¶
some_field: new DBRef('collection_of_target', target_document._id)
User administration¶
To setup authentication edit
/etc/mongodb.conf
and set
auth = true
Now execute the following in mongo shell
use <db>
db.addUser({user: "foo", pwd: "bar", roles: ["readWrite", "dbAdmin"]})
use role
read
for read-only accessrole
root
will give overall accessother useful roles “userAdminAnyDatabase”, “readWriteAnyDatabase”, “dbAdminAnyDatabase” (use db admin in this case)
give
clusterAdmin
roles if user should be able to configure clusteringTo log into a database
db.auth("user", "pass")
List all users
db.getUsers()
List one user
db.getUser("foo")
To change a users password
db.changeUserPassword("user", "newpassword")
Update a users roles
db.grantRolesToUser("vip_user", ["userAdminAnyDatabase", "readWriteAnyDatabase", "dbAdminAnyDatabase", "clusterAdmin"])
Replication¶
All nodes share the same data
You need at least 3 server
Edit
/etc/mongodb.conf
and set a replSet
replSet = rs0
On the master node execute the folowing in mongo shell
rs.initiate()
rs.conf()
rs.add("mongodb1.example.net")
rs.add("mongodb2.example.net")
rs.status()
You can define one as master and the others as slaves
Clustering / Sharding¶
Sharding means to spread the database horizontally across multiple servers
config servers store the complete metadata of a cluster (you should have 3)
mongod --configsvr --dbpath <path>
mongos are query servers (configdb must define configsvr nodes in same order!)
mongos --configdb node1:27019,node2:27019,node3:27019
shard servers store the data
mongo --host querysrv --port 27017
You can add the new shard to a replica set
sh.addShard( "rs0/newnode:27017" )
or to a whole
sh.addShard( "newnode:27017" )
You can set
configsvr
orshardsvr=true
in/etc/mongodb.conf
to make the server a config, query or shard serverconfigdb = <cfgsrv1>, <cfgsrv2>, <cfgsrv3>
To enable sharding for a database run
sh.enableSharding("<db>")
sh.status()
Backup¶
#!/bin/bash
$BACKUP_DIR="/my/backup/path"
cd $BACKUP_DIR
/usr/bin/mongodump
/bin/tar cvjf `hostname`_`date +%Y%m%d`.tbz dump && /bin/rm -rf $BACKUP_DIR/dump
Show real data size¶
With indizes
db.<collection>.totalSize()
Only data
db.<collection>.dataSize()
Defrag¶
Whole database
db.repairDatabase()
Single collection
db.<collection>.compact()
Load collection into memory¶
db.runcommand({ touch: “collection_name”, data: true, index: true})
Round robin collections¶
If you’ve not heard of capped collections before, they’re a nice little feature of MongoDB that lets you have a high-performance circular queue. Capped collections have the following nice features:
They “remember” the insertion order of their documents
They store inserted documents in the insertion order on disk
They remove the oldest documents in the collection automatically as new documents are inserted
db.create_collection(
'capped_collection',
capped=True,
size=size_in_bytes, # required
max=max_number_of_docs, # optional
autoIndexId=False) # optional
One can tail for new data in capped collections
cur = db.capped_collection.find(
tailable=True,
await_data=True)
Troubleshooting¶
I always get
not master
errors
rs.status()
rs.initiate()
Or if you really want to access a slave node
db.setSlaveOk()
Getting help¶
db.help()