mogodb 的自定义函数定义及引用
生活随笔
收集整理的這篇文章主要介紹了
mogodb 的自定义函数定义及引用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在學習MONGODB 遇到以下問題:
函數 getNextSequence 生成序列號,官方方法:
建立一張表,記錄某一個表的_ID 當前值。后面調用此函數生成下一個序列號,
在測試此函數時,遇到以下問題:
(url:http://docs.mongodb.org/manual/t ... incrementing-field/)
> function getNextSequence(name) {
...??? var ret = db.counters.findAndModify(
...?????????? {
...???????????? query: { _id: name },
...???????????? update: { $inc: { seq: 1 } },
...???????????? new: true
...?????????? }
...??? );
...
...??? return ret.seq;
... }
直接調用,沒有問題
> getNextSequence("userid");
17
退出后,再進來,此函數不見了,是沒有保存嗎?那前面的定義只是臨時的???
這點沒明白。如果是此時沒有保存,其存在的方法有什么意義?這點還真是和其它數據庫區別很大。
> exit
bye
[root@localhost bin]# ./mongo-start.sh
MongoDB shell version: 2.5.5
connecting to: 127.0.0.1:28001/test
Server has startup warnings:
2014-02-19T10:00:20.412+0800 [initandlisten]
2014-02-19T10:00:20.412+0800 [initandlisten] ** NOTE: This is a development version (2.5.5) of MongoDB.
2014-02-19T10:00:20.412+0800 [initandlisten] **?????? Not recommended for production.
2014-02-19T10:00:20.413+0800 [initandlisten]
> getNextSequence("userid");
2014-02-19T14:11:10.499+0800 ReferenceError: getNextSequence is not defined
再用 保存到DB.SYSTEM.JS 的方式保存自定義函數(或叫存儲過程):
db.system.js.insert(
{_id:"getNextSequence",value:function getNextSequence(name) {
?? var ret = db.counters.findAndModify(
????????? {
??????????? query: { _id: name },
??????????? update: { $inc: { seq: 1 } },
??????????? new: true
????????? }
?? );
?? return ret.seq;
}
});
但再使用同前面的調用 方式無效了。
> getNextSequenct("userid");
2014-02-19T14:21:03.912+0800 ReferenceError: getNextSequenct is not defined
>
雖然查到以下方法進行調用,但感覺很是怪。
> db.eval('getNextSequence("userid")');
18
> db.testdb.insert({_id:db.eval('getNextSequence("userid")')});
SingleWriteResult({
??????? "writeErrors" : [ ],
??????? "writeConcernErrors" : [ ],
??????? "nInserted" : 1,
??????? "nUpserted" : 0,
??????? "nUpdated" : 0,
??????? "nModified" : 0,
??????? "nRemoved" : 0,
??????? "upserted" : [ ]
})
> db.testdb.find();
{ "_id" : 19 }
>
函數 getNextSequence 生成序列號,官方方法:
建立一張表,記錄某一個表的_ID 當前值。后面調用此函數生成下一個序列號,
在測試此函數時,遇到以下問題:
(url:http://docs.mongodb.org/manual/t ... incrementing-field/)
> function getNextSequence(name) {
...??? var ret = db.counters.findAndModify(
...?????????? {
...???????????? query: { _id: name },
...???????????? update: { $inc: { seq: 1 } },
...???????????? new: true
...?????????? }
...??? );
...
...??? return ret.seq;
... }
直接調用,沒有問題
> getNextSequence("userid");
17
退出后,再進來,此函數不見了,是沒有保存嗎?那前面的定義只是臨時的???
這點沒明白。如果是此時沒有保存,其存在的方法有什么意義?這點還真是和其它數據庫區別很大。
> exit
bye
[root@localhost bin]# ./mongo-start.sh
MongoDB shell version: 2.5.5
connecting to: 127.0.0.1:28001/test
Server has startup warnings:
2014-02-19T10:00:20.412+0800 [initandlisten]
2014-02-19T10:00:20.412+0800 [initandlisten] ** NOTE: This is a development version (2.5.5) of MongoDB.
2014-02-19T10:00:20.412+0800 [initandlisten] **?????? Not recommended for production.
2014-02-19T10:00:20.413+0800 [initandlisten]
> getNextSequence("userid");
2014-02-19T14:11:10.499+0800 ReferenceError: getNextSequence is not defined
再用 保存到DB.SYSTEM.JS 的方式保存自定義函數(或叫存儲過程):
db.system.js.insert(
{_id:"getNextSequence",value:function getNextSequence(name) {
?? var ret = db.counters.findAndModify(
????????? {
??????????? query: { _id: name },
??????????? update: { $inc: { seq: 1 } },
??????????? new: true
????????? }
?? );
?? return ret.seq;
}
});
但再使用同前面的調用 方式無效了。
> getNextSequenct("userid");
2014-02-19T14:21:03.912+0800 ReferenceError: getNextSequenct is not defined
>
雖然查到以下方法進行調用,但感覺很是怪。
> db.eval('getNextSequence("userid")');
18
> db.testdb.insert({_id:db.eval('getNextSequence("userid")')});
SingleWriteResult({
??????? "writeErrors" : [ ],
??????? "writeConcernErrors" : [ ],
??????? "nInserted" : 1,
??????? "nUpserted" : 0,
??????? "nUpdated" : 0,
??????? "nModified" : 0,
??????? "nRemoved" : 0,
??????? "upserted" : [ ]
})
> db.testdb.find();
{ "_id" : 19 }
>
總結
以上是生活随笔為你收集整理的mogodb 的自定义函数定义及引用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 64位WINDOWS 使用PL SQL
- 下一篇: 从默认的 _id 字段中,取得时间信息