Search code examples
mongodbconsoleperformancecounter

Where does MongoDB store function added via console?


I created auto-incrementing sequence field via counters collection and getNextSequence() function (absolutely like in docs)

According another document JavaScript functions are stored in a special system collection named system.js

But there is no such collection at my database (a least db.system.js.find() shows empty result):

> db.dropDatabase();
{ "dropped" : "mongopa", "ok" : 1 }
> version()
3.2.5
> db.counters.insert({_id: "userid", seq: 0 })
WriteResult({ "nInserted" : 1 })
> db.counters.find()
{ "_id" : "userid", "seq" : 0 }
> function getNextSequence(name) {
...    var ret = db.counters.findAndModify(
...           {
...             query: { _id: name },
...             update: { $inc: { seq: 1 } },
...             new: true
...           }
...    );
... 
...    return ret.seq;
... }
> db.system.js.find()
> show collections
counters
> db.users.insert({"login":"demo","user_id":getNextSequence("userid"),"password":"demo"})
WriteResult({ "nInserted" : 1 })
> db.users.find()
{ "_id" : ObjectId("574ff1c7436a1b4f9c6f47b9"), "login" : "demo", "user_id" : 1, "password" : "demo" }
> db.users.insert({"login":"demo2","user_id":getNextSequence("userid"),"password":"demo2"})
WriteResult({ "nInserted" : 1 })
> db.users.find()
{ "_id" : ObjectId("574ff1c7436a1b4f9c6f47b9"), "login" : "demo", "user_id" : 1, "password" : "demo" }
{ "_id" : ObjectId("574ff1d6436a1b4f9c6f47ba"), "login" : "demo2", "user_id" : 2, "password" : "demo2" }
> 

So where does the getNextSequence function really stored?


Solution

  • When you define the function as,

    function getNextSequence(name) {
    var ret = db.counters.findAndModify(
           {
                 query: { _id: name },
             update: { $inc: { seq: 1 } },
             new: true
           }
    );
    return ret.seq;
    }
    

    It is merely defined for that particular session and is not available to you once the session ends. Hence, its not saved anywhere.

    To make the function re-usable across the sessions, you need to explicitly save the function is system.js by using,

    db.system.js.save(
    {
        _id: "getNextSequence",
        value: function(name){var ret = db.counters.findAndModify({
                 query: { _id: name },
                 update: { $inc: { seq: 1 } },
                 new: true
           });
        return ret.seq;}
     })
    

    Once you have saved the function, you can cross-check it by,

    db.system.js.find()
    

    You need to call this

    db.loadServerScripts();

    across the sessions. It loads all the scripts saved in system.js collection.

    For details, please check here.