2016-06-02 29 views
0

I erstellt automatisch inkrementierende Sequenzfeld über Sammel Zähler und getNextSequence() Funktion (absolut wie in docs)Wo wird MongoDB speichern Funktion über die Konsole hinzugefügt?

Nach another document JavaScript-Funktionen werden in einem speziellen System Sammlung system.js

Aber es ist meine keine solche Sammlung namens gespeichert Datenbank (a dest db.system.js.find() zeigt leeres Ergebnis):

> 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" } 
> 

woher kommt also die getNextSequence Funktion wirklich gespeichert?

Antwort

3

Wenn Sie die Funktion als definieren

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

Es nur für diese bestimmte Sitzung definiert ist und Sie, sobald die Sitzung beendet nicht zur Verfügung. Daher ist es nirgends gespeichert.

Um die Funktion wiederverwendbare über die Sitzungen zu machen, müssen Sie explizit speichern ist die Funktion system.js unter Verwendung

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

Sobald Sie die Funktion gespeichert haben, können Sie es Cross-Check durch ,

db.system.js.find() 

Sie benötigen diese

db.loadServerScripts nennen();

über die Sitzungen hinweg. Es lädt alle Skripte in system.js Sammlung gespeichert.

Für Details überprüfen Sie bitte here.