Node.js 如何自动生成自定义id';猫鼬里有什么?

Node.js 如何自动生成自定义id';猫鼬里有什么?,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我想通过Mongoose/MongoDB管理我自己的\u id,因为默认的id相当长,并且占用带宽 困难在于我需要创建它们(比如,通过增加计数器),但我需要在并发环境(Node.JS)中这样做。有没有一个简单的例子,我可以遵循它创建一个模式,使用一个自定义的\u id和一个静态方法(或更好的方法),在创建新文档时自动生成下一个唯一的\u id。正如Chad简要介绍的那样,Mongo为您实现了一个uuid系统,考虑到时间戳,网络地址和计算机名称,加上一个自动递增的2位计数器(如果出现具有相同时间戳

我想通过Mongoose/MongoDB管理我自己的
\u id
,因为默认的id相当长,并且占用带宽


困难在于我需要创建它们(比如,通过增加计数器),但我需要在并发环境(Node.JS)中这样做。有没有一个简单的例子,我可以遵循它创建一个模式,使用一个自定义的
\u id
和一个静态方法(或更好的方法),在创建新文档时自动生成下一个唯一的
\u id

正如Chad简要介绍的那样,Mongo为您实现了一个uuid系统,考虑到时间戳,网络地址和计算机名称,加上一个自动递增的2位计数器(如果出现具有相同时间戳的多个条目)。此模式用于允许分布式数据库(即,在不同的计算机上运行不同的数据库实例),同时确保每个条目仍具有唯一标识符(因为计算机名称部分将不同)


尝试使用自己的模式可能会极大地限制mongo提供的可伸缩性。

正如Chad简要提到的,mongo为您实现了一个uuid系统,考虑了时间戳、网络地址和机器名,以及一个自动递增的2位计数器(如果出现具有相同时间戳的多个条目)。此模式用于允许分布式数据库(即,在不同的计算机上运行不同的数据库实例),同时确保每个条目仍具有唯一标识符(因为计算机名称部分将不同)


尝试使用自己的模式可能会极大地限制mongo提供的可伸缩性。

您可以使用mongo的findAndModify()生成顺序值。下面是一个示例:

// (assuming db is a reference to a MongoDB database)
var counters = db.collection('counters');
var query = {'name': 'counterName'};
var order = [['_id','asc']];
var inc = {$inc:{'next':1}};
var options = {new: true, upsert: true};
counters.findAndModify(query, order, inc, options, function(err, doc) {

  if(err) {
    callback(err);
    return;
  }      

  var id = doc.next;
  callback(null, id);
});

尽管在应用程序上生成顺序ID看起来很不错,但请记住它们有一些缺点(例如,当您需要从地理位置拆分数据库时),这就是Mongo使用长伪随机密钥的原因。

您可以使用Mongo的findAndModify()生成顺序值。下面是一个示例:

// (assuming db is a reference to a MongoDB database)
var counters = db.collection('counters');
var query = {'name': 'counterName'};
var order = [['_id','asc']];
var inc = {$inc:{'next':1}};
var options = {new: true, upsert: true};
counters.findAndModify(query, order, inc, options, function(err, doc) {

  if(err) {
    callback(err);
    return;
  }      

  var id = doc.next;
  callback(null, id);
});

尽管在应用程序上生成顺序ID看起来很不错,但请记住它们有一些缺点(例如,当您需要按地理位置拆分数据库时)这就是Mongo使用长伪随机密钥的原因。

ID的长度是否是应用程序的严重瓶颈?我对此深表怀疑。最好的方法是使用uuid系统,MongoDB为您提供了这一点。虽然这是一个很好的观点,但OP的原因不是唯一可能的,这个问题肯定是有效的。例如,在在我们的情况下,我们需要为应用程序中的许多实体提供用户友好的id,这些id也必须是唯一的和强制性的,基本上扮演着_id的角色。因此,虽然几乎没有什么比uuid更易于维护,但它的丑陋肯定是一个缺点。Mongo团队btw的官方建议是不要在su中使用额外的字段ch cases,而不是override _id。id的长度是否是应用程序的严重瓶颈?我对此深表怀疑。最好的方法是使用uuid系统,MongoDB为您提供了这一点。虽然这是一个好的观点,但OP的理由不是唯一可能的,而且这个问题肯定是有效的。例如,在我们的情况下,我们需要用户友好的id对于应用程序中的许多实体,这些id也必须是唯一的和强制性的,基本上扮演着_id的角色。因此,虽然几乎没有什么比uuid更易于维护,但它的丑陋肯定是一个缺点。Mongo团队btw的官方建议是在这种情况下不要使用额外的字段,而要覆盖_id.Chad和y你有一个观点,特别是对于地理位置分散的系统。也就是说,我的应用程序需要为大量(小型)用户提供服务将文档发送到客户端浏览器,并在每个浏览器中携带一些
\u id
。仅用两个字符替换24个字符将大大减少流量。对此有何想法?我的想法是,使用现代技术,可以节省(非常小)的开销带宽真的不值得无法扩展。如果你100%确定永远不需要扩展,并且你的流量总是足够低,可以由一台机器处理,你可以自己做。很可能这并不值得。你可以计算出你将节省的带宽成本,但我怀疑这是否值得你的时间,更不用说我提到的其他权衡了。Chad和你有一个观点,特别是对于地理位置分散的系统。话虽如此,我的应用程序需要服务大量(小型)将文档发送到客户端浏览器,并在每个浏览器中携带一些
\u id
。仅用两个字符替换24个字符将大大减少流量。对此有何想法?我的想法是,使用现代技术,可以节省(非常小)的开销带宽真的不值得无法扩展。如果你100%确定永远不需要扩展,并且你的流量总是足够低,可以由一台机器处理,你可以自己做。很可能这并不值得。你可以计算出你将节省的带宽成本,但我怀疑这是否值得你的时间,更不用说我提到的其他权衡了。