轉自: https://blog.csdn.net/miyatang/article/details/19486797
像mysql中可以自動生成自增長主鍵id,mongdb中也可以通過js函數實現,
函數 getNextSequence 生成序列號,官方方法:
建立一張表,記錄某一個表的_ID 當前值。后面調用此函數生成下一個序列號,
在js 函數如下:
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 }
>