MongoDB 存储通过控制台添加的功能在哪里?
Where does MongoDB store function added via console?
我通过计数器集合和 getNextSequence()
函数创建了自动递增序列字段(与 docs 完全相同)
根据 another document JavaScript 函数存储在名为 system.js
的特殊系统集合中
但我的数据库中没有这样的集合(至少 db.system.js.find()
显示为空结果):
> 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" }
>
那么 getNextSequence 函数真正存储在哪里?
当您将函数定义为,
function getNextSequence(name) {
var ret = db.counters.findAndModify(
{
query: { _id: name },
update: { $inc: { seq: 1 } },
new: true
}
);
return ret.seq;
}
它只是为该特定会话定义的,会话结束后您将无法使用。因此,它没有保存在任何地方。
要使该函数可在会话中重复使用,您需要使用
显式保存该函数 system.js
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;}
})
保存函数后,您可以通过以下方式对其进行交叉检查,
db.system.js.find()
你需要调用这个
db.loadServerScripts();
跨会话。它加载保存在 system.js 集合中的所有脚本。
详情请查看here。
我通过计数器集合和 getNextSequence()
函数创建了自动递增序列字段(与 docs 完全相同)
根据 another document JavaScript 函数存储在名为 system.js
但我的数据库中没有这样的集合(至少 db.system.js.find()
显示为空结果):
> 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" }
>
那么 getNextSequence 函数真正存储在哪里?
当您将函数定义为,
function getNextSequence(name) {
var ret = db.counters.findAndModify(
{
query: { _id: name },
update: { $inc: { seq: 1 } },
new: true
}
);
return ret.seq;
}
它只是为该特定会话定义的,会话结束后您将无法使用。因此,它没有保存在任何地方。
要使该函数可在会话中重复使用,您需要使用
显式保存该函数 system.jsdb.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;}
})
保存函数后,您可以通过以下方式对其进行交叉检查,
db.system.js.find()
你需要调用这个
db.loadServerScripts();
跨会话。它加载保存在 system.js 集合中的所有脚本。
详情请查看here。