我需要一个自动增量字段,但不是主ID,它只是为客户支持应用程序的用户提供易于记忆的案例编号。
我发现这篇文章解释了如何在mongodb http://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/上创建一个自动增量字段,但还不支持这个解决方案。
如何实现此功能?我不在乎解决方案是否由于错误而跳过一些连续的案例编号,但案例编号必须是唯一的。
是否有其他方法可以生成唯一且短的案例编号?我不想向用户提供类似PxyooJWSKc3sMz6Lc的案例代码,因为他们必须使用案例编号来引用他们的问题。
修改
Minimong不支持findAndModify,因此我无法使用我发布的链接中列出的第一个解决方案。第二种解决方案还需要在minimongo上不可用的方法。
答案 0 :(得分:12)
使用mongo-counter package,可以使用方法incrementCounter(name)
创建增量器。该实现基于Create an Auto-Incrementing Sequence Field直接访问数据库而无需通过Meteor Collection。
Meteor.methods({
'addRecord':function(doc) {
doc.id = incrementCounter('docId');
MyCollection.insert(doc);
return doc.id;
}
});
<强>更新强>
Atmosphere上有new mongo counter packages,可能比我最初的建议要好。
答案 1 :(得分:4)
有几种方法可以做到这一点。如果您需要它绝对一致,您可以将当前整数存储在您的集合中。使用Meteor.call添加新记录而不是从客户端执行。
E.g
服务器端js
Meteor.methods({
'addRecord':function(doc) {
currentId = MyCollection.findOne({},{sort:{id:-1}}).id || 1;
doc.id = currentId + 1;
MyCollection.insert(doc);
return doc.id;
}
});
客户端js
doc = {name:"Bob"}
//MyCollection.insert(doc)
//Use this instead
Meteor.call("addRecord", doc, function(err,result) {
if(result) {
console.log("Successfully added new record with auto_inc id " + result);
}
}
使用Meteor.call这样做你会失去一件事:延迟补偿。
您可以存储从Unix时间戳构建的内容,并将其缩短为更适用的内容(例如,通过切掉前几位数字):
new Date().getTime().toString().substr(4)