9

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

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

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

是否有另一种方法来生成唯一且简短的案例编号?我不想给用户一个像 PxyooJWSKc3sMz6Lc 这样的案例代码,因为他们必须参考案例编号的问题。

编辑:

Minimong 不支持 findAndModify,所以我不能使用我发布的链接中列出的第一个解决方案。第二种解决方案还需要 minimongo 上没有的方法。

4

2 回答 2

12

使用mongo-counter 包,可以使用方法创建增量器incrementCounter(name)。该实现基于创建一个自动递增序列字段直接访问数据库而不通过流星集合。

Meteor.methods({
    'addRecord':function(doc) {
        doc.id = incrementCounter('docId');
        MyCollection.insert(doc);
        return doc.id;
    }
});

更新

Atmosphere 上有新的 mongo counter 包,可能比我最初的建议要好。

于 2013-08-08T21:27:29.467 回答
4

那么有几种方法可以做到这一点。如果您需要它绝对一致,您可以将当前整数存储在您的集合中并使用 Meteor.call 添加新记录,而不是从客户端执行此操作。

例如

服务器端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)
于 2013-04-09T06:43:15.237 回答