MongoDB: Count of Indexes on a collection

This simple one liner will list all the collections along with the number of indexes it has.

db.getCollectionNames().forEach(function(collection) {print(collection + ": " + db[collection].getIndexes().length);});

 

More info here:

https://stackoverflow.com/questions/39952005/count-of-indexes-for-each-collection-in-mongodb

MongoDB: How to make all fields of a collection lowercase

This simple script has been tested on MongoDB 3.2. It should work on older versions of MongoDB as well.

db.collectionName.find( {}, { 'fieldName': 1 } ).forEach(function(doc) {
db.collectionName.update(
   { _id: doc._id},
   { $set : { 'fieldName' : doc.fieldName.toLowerCase() } },
   { multi: true }
)
});

To convert all fields inside of an array, use this trick… MongoDB: How to lower case all items of an array

MongoDB current operations and profiling

Current operations

db.currentOp()

Operations running for over 5 seconds…

db.currentOp().inprog.forEach(function(op) {
    if (op.secs_running > 5) printjson(op);
})

Write operations waiting for a lock

db.currentOp(
  {
    "waitingForLock" : true,
    $or: [
      { "op" : { "$in" : [ "insert", "update", "remove" ] } },
      { "query.findandmodify": { $exists: true } }
    ]
  }
)

Operations that have never yielded

db.currentOp(
   {
     "active" : true,
     "numYields" : 0,
     "waitingForLock" : false
   }
)

Index creation operations

db.currentOp(
    {
      $or: [
        { op: "query", "query.createIndexes": { $exists: true } },
        { op: "insert", ns: /\.system\.indexes\b/ }
      ]
    }
)

Profiling Levels

  • 0 – the profiler is off, does not collect any data.
  • 1 – collects profiling data for slow operations only.
  • 2 – collects profiling data for all database operations.

Checking profiling level

db.getProfilingStatus()

Turn on profiling for operations taking more than 1 second (1000 milliseconds)

db.setProfilingLevel(1,1000)

Turn profiling off

db.setProfilingLevel(0)

5 most recent operations logged in the system.profile table

db.system.profile.find().limit(5).sort( { ts : -1 } ).pretty()

Recent operations that took longer than 5 seconds

db.system.profile.find( { millis : { $gt : 5000 } } ).pretty()

Ten recent operations that took over 15 seconds. Print only important fields.

db.system.profile.find({
 millis: {
 $gt: 15000
 }
}, {
 ns: 1,
 query: 1,
 numYield: 1,
 millis: 1
}).limit(10).pretty();

More examples:

db.system.profile.find({
 millis: {
 $gt: 5000
 },
 ts: {
 $gt: new Date(ISODate().getTime() - 1000 * 60 * 10)
 }
}).limit(5).pretty();

db.system.profile.find({
 millis: {
 $gt: 5000
 },
 ts: {
 $gt: new Date(ISODate().getTime() - 1000 * 60 * 10)
 }
}, {
 op: 1,
 ns: 1,
 query: 1,
 numYield: 1,
 millis: 1,
 ts: 1
}).limit(5).pretty();

To change the size of the system.profile collection, you must:

  1. Disable profiling.
  2. Drop the system.profile collection.
  3. Create a new system.profile collection.
  4. Re-enable profiling.

To create a new system.profile collections that’s 4000000 bytes, use the following sequence of operations

db.setProfilingLevel(0)
db.system.profile.drop()
db.createCollection( "system.profile", { capped: true, size:4000000 } )
db.setProfilingLevel(1)

Running MongoDB 2 and 3 on the same computer

Manually install (untar) MongoDB 2 and 3 into two different folders, for example

.../mongodb2
.../mongodb3

Create log and data folders for each version

.../mongodb2/log
.../mongodb2/data 
.../mongodb3/log
.../mongodb3/data

Create a conf file for each version.

.../mongodb2/data/mongod.conf
.../mongodb3/data/mongod.conf

Contents of these files can be something like

logpath=.../mongodb2/log/mongod.log
port=27017
dbpath=.../mongodb2/data
pidfilepath=.../mongodb2/mongod.pid

logpath=.../mongodb3/log/mongod.log
port=37017
dbpath=.../mongodb3/data
pidfilepath=.../mongodb3/mongod.pid

As you can see here, MongoDB 2 will be running on port 27017 and MongoDB 3 will be running on port 37017

No start each server with the following commands

.../mongodb2/bin/mongod  --config .../mongodb2/mongod.conf
.../mongodb3/bin/mongod  --config .../mongodb3/mongod.conf

That’s it 🙂

Two different command line clients can be run as follows

.../mongodb2/bin/mongo --port 27017
.../mongodb3/bin/mongo --port 37017