Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何在meteor上创建自动递增字段?_Node.js_Mongodb_Meteor - Fatal编程技术网

Node.js 如何在meteor上创建自动递增字段?

Node.js 如何在meteor上创建自动递增字段?,node.js,mongodb,meteor,Node.js,Mongodb,Meteor,我需要一个自动递增字段,但不是主id,它只是为客户支持应用程序的用户提供一个易于记忆的案例编号 我发现这篇文章解释了如何在mongodb上创建一个自动递增字段,但minimongo还不支持这种解决方案 如何实现此功能?我不在乎解决方案是否因为错误而跳过一些连续的案例编号,但案例编号必须是唯一的 是否有其他方法来生成唯一和简短的案例编号?我不想给用户一个像这样的案例代码,因为他们必须用案例编号来说明他们的问题 编辑: Minimong不支持findAndModify,因此我无法使用我发布的链接上列

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

我发现这篇文章解释了如何在mongodb上创建一个自动递增字段,但minimongo还不支持这种解决方案

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

是否有其他方法来生成唯一和简短的案例编号?我不想给用户一个像这样的案例代码,因为他们必须用案例编号来说明他们的问题

编辑:


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

有几种方法可以做到这一点。如果需要绝对一致,可以将当前整数存储在集合中&使用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;
    }
});
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);
    }
}
客户端js

Meteor.methods({
    'addRecord':function(doc) {
        currentId = MyCollection.findOne({},{sort:{id:-1}}).id || 1;
        doc.id = currentId + 1;
        MyCollection.insert(doc);
        return doc.id;
    }
});
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);
    }
}
用流星号打电话你会失去一件事:延迟补偿

其他可能性 您可以存储根据Unix时间戳构建的内容,并将其缩短为更适用的内容(例如,通过切断前几个数字):

使用,可以使用方法
incrementCounter(name)
创建递增器。该实现基于直接访问数据库而无需经过Meteor收集

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


在大气中存在一些问题,可能比我最初的建议要好。

不幸的是,这是最安全的解决方案。(Minimongo看起来不再更新了吗?你可能想考虑使用10GEN的Python官方驱动程序,PyMongo:)我编辑了我的请求。我认为,最安全的解决方案是指我发布的链接,但它不会与minimongo一起工作,所以我还没有一个解决方案。Meteor是node.js框架,我不使用python。对不起,minimongo是/是最先出现的python库。:)所以,我原以为你在说Python。在这种情况下,我可以不进行延迟补偿,但在你的第一个解决方案中,我认为id可以重复,因为操作不是原子的。我现在可以使用这个解决方案,因为我的用户很少,但对于我将要构建的另一个应用程序,我需要另一个解决方案。谢谢我不太确定我能理解它在哪里是非原子的?Mongodb并不是真正的acid兼容。对于节点,一次只能运行一个线程,因此它的工作方式应该与MyCollection.insert相同(如果不是更好的话),因为实际的真/假回调是以延迟补偿为代价返回的MongoDB文档说“findModify()方法原子地修改并返回单个文档。”它用于我发布的链接上的第一个解决方案,因此可以保证当我获得id时,它是唯一的。使用您的解决方案,我认为两个并发请求可以在插入之前获得相同的id。我不是mongodb或node.js专家,所以我不确定我说的是不是真的。如果node只运行一个线程,我认为你是对的,唯一性将得到保证。好的,我认为这需要更多的解释,即使对我来说,我也不能绝对肯定它是否是单线程的。我读过很多资料,说它在某个层次上,而不是在另一个层次上。它是事件,因此每个请求都将从主线程派生到节点工作线程中,这是单线程的,因此它们的唯一性仍应得到保证注意,不鼓励使用仅链接的答案,因此答案应该是搜索解决方案的终点(而不是另一个引用的中途停留,随着时间的推移,这些引用往往会过时)。请考虑在这里添加一个独立的概要,将链接作为参考。应该安装哪个包?atmospherejs.com上目前有三种不同的计数器:konecty:mongo计数器(最流行)、mrt:mongo计数器(来自awwx)和gabrielengel:konecty mongo计数器。@10basetom。我正在使用osv:mongo计数器,但我建议您检查所有软件包(文档、使用统计、支持等),并选择更方便的软件包。