如何在流星上创建自动增量字段?

时间:2013-04-08 18:59:53

标签: node.js mongodb meteor

我需要一个自动增量字段,但不是主ID,它只是为客户支持应用程序的用户提供易于记忆的案例编号。

我发现这篇文章解释了如何在mongodb http://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/上创建一个自动增量字段,但还不支持这个解决方案。

如何实现此功能?我不在乎解决方案是否由于错误而跳过一些连续的案例编号,但案例编号必须是唯一的。

是否有其他方法可以生成唯一且短的案例编号?我不想向用户提供类似PxyooJWSKc3sMz6Lc的案例代码,因为他们必须使用案例编号来引用他们的问题。

修改

Minimong不支持findAndModify,因此我无法使用我发布的链接中列出的第一个解决方案。第二种解决方案还需要在minimongo上不可用的方法。

2 个答案:

答案 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)