http://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/
官方文档给出了2种解决方法,我只看了第一种的时候:
function getNextSequence(name) { var ret = db.counters.findAndModify( { query: { _id: name }, update: { $inc: { seq: 1 } }, new: true } ); return ret.seq; }
与
function getNextSequence(name) { var ret = db.counters.findAndModify( { query: { _id: name }, update: { $inc: { seq: 1 } }, new: true, upsert: true } ); return ret.seq; }
英文看得有点模糊,多了一个upsert到底是好还是不好?
不好,除非你有唯一索引,否则可能插入多个相同名字的文档。可能会有多个 findAndModify
函数同时运行,它们都发现找不到已有的文档,于是都决定插入新文档,于是就重复了。