缩短node.js和mongoose中的ObjectId

2024-06-04

我的网址目前如下所示:

http://www.sitename.com/watch?companyId=507f1f77bcf86cd799439011&employeeId=507f191e810c19729de860ea&someOtherId=.....

所以,正如你所看到的,它变得相当长、非常快。 我正在考虑缩短这些 ObjectId。 我的想法是,我应该向数据库中的每个模型添加名为“shortId”的新字段。所以不要有:

var CompanySchema = mongoose.Schema({
  /* _id will be added automatically by mongoose */
  name:         {type: String},
  address:      {type: String},
  directorName: {type: String}
});

我们会有这样的:

var CompanySchema = mongoose.Schema({
  /* _id will be added automatically by mongoose */
  shortId:      {type: String}, /* WE SHOULD ADD THIS */
  name:         {type: String},
  address:      {type: String},
  directorName: {type: String},
});

我找到了一种方法来做到这一点:

// Encode
var b64 = new Buffer('47cc67093475061e3d95369d', 'hex')
  .toString('base64')
  .replace('+','-')
  .replace('/','_')
;
// -> shortID is now: R8xnCTR1Bh49lTad

但我仍然认为它可以更短。

另外,我发现了这个 npm 模块:https://www.npmjs.com/package/short-mongo-id https://www.npmjs.com/package/short-mongo-id但我没有看到它被使用太多,所以我无法判断它是否可靠。

有人有什么建议吗?


我最终这样做了:

安装shortId模块(https://www.npmjs.com/package/shortid https://www.npmjs.com/package/shortid) 现在,当对象保存在数据库中时,您需要以某种方式将这个 ShortId 粘贴到对象上。我发现最简单的方法是将此功能附加到 mongoose 函数的末尾,称为“save()”(如果您承诺模型,则为“saveAsync()”)。你可以这样做:

var saveRef = Company.save;
Company.save = function() {
  var args = Array.prototype.slice.call(arguments, 0);
  // Add shortId to this company
  args[0].shortId = shortId.generate();
  return saveRef.apply(this, args);
};

因此,您基本上只需在每个 Model.save() 函数中附加此功能即可添加 ShortId。就是这样。

编辑: 另外,我发现你可以像这样直接在 Schema 中做得更好、更干净。

var shortId = require('shortid');
var CompanySchema = mongoose.Schema({
  /* _id will be added automatically by mongoose */
  shortId: {type: String, unique: true, default: shortId.generate}, /* WE SHOULD ADD THIS */
  name: {type: String},
  address: {type: String},
  directorName: {type: String}
});

EDIT :现在您可以使用 Nanooid 库,它的性能更高且经过优化。该文档也很好:https://github.com/ai/nanoid/ https://github.com/ai/nanoid/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

缩短node.js和mongoose中的ObjectId 的相关文章

随机推荐

  • 使用 Quartz Scheduler 在 Java Web 应用程序中发送电子邮件通知和提醒

    我想开发一个简单的 Java Web 应用程序 以便在完成某些任务后发送电子邮件通知 例如提交审批请求以及定期提醒 即审批者 我想使用 Quartz Scheduler 来做到这一点 我是新手 所以任何人都可以帮助我开始这个 提前致谢 我将
  • 在类型生成期间使用 jaxb 绑定替换 XmlType.namespace

    我的 Web 服务应用程序正在从 Axis 迁移到 JAX WS 但我在进行某些转换时遇到了问题 我的主要问题是 我有几个具有相同类型的 XSD 其定义略有不同 但名称相同 在 wsimport 期间 我可以使用外部 JAXB 绑定文件来解
  • CardView 未显示在 RecyclerView 中

    我有一个简单的CardView里面一个RecyclerView但我看不到任何卡片出现 这是我当前的代码 MainActivity xml
  • 如何在Matlab中自定义轮廓线?

    我正在准备一个等高线图 我应该在其中突出显示特定级别的等高线 例如 我的轮廓线值位于 1 和 1 之间 我想突出显示与值 0 相对应的线 我尝试使用以下过程来执行此操作 M c contourf longitude latitude del
  • for 循环范围内的初始值设定项列表

    我有从单个超类型派生的不同类型的对象 我想知道使用中有没有什么缺点std initializer在 for 循环范围内列出 如下所示 for auto object std initializer list object1 object2
  • PyMongo 中的 MapReduce

    我的蒙戈收藏 Impressions具有以下格式的文档 uid 10 impressions pos 6 id 123 service furniture pos 0 id 128 service electronics pos
  • CORS 问题。 Flask <-> AngularJS

    使用 angularjs 客户端应用程序和提供 api 的 Flask 应用程序启动一个新项目 我使用 mongodb 作为数据库 我必须立即排除 jsonp 因为我需要能够跨不同端口进行 POST 因此 我们为 Angular 应用程序设
  • bash脚本ip主机

    在第一个中 如果我们希望显示主机名 这是文件中的第五个字段 然后 如果我们提供给主机命令的 IP 不存在 则该命令将返回消息 3 NXDOMAIN 脚本应该识别命令是否 未找到 在这种情况下 它将 必须简单地打印 bin bash ip 1
  • 使用 django 流式传输 mp3 文件,从带有

    我正在尝试制作一个小应用程序来通过 Web 界面传输我的 mp3 文件 并且我考虑过使用 django 在 python 中进行服务器端操作 我想要像 stream ID 这样的 url 来流式传输与该 ID 相对应的 mp3 我在 dja
  • sqlite.net + monotouch = SIGSEGV 崩溃

    我们正在使用以下内容 Xamarin 3 Xamarin 表单 单点触控 sqlite net iOS模拟器 硬件 该应用程序在后台线程上与服务器同步数据 整个应用程序只共享一个 SQLite 连接对象 前台查询在后台同步运行的同时执行 所
  • 按钮:带滚动条的下载按钮仅下载几行

    我正在处理超过 100 000 行的表并使用DT包裹 开发版本0 1 56 在 Shiny App 中将其可视化 此外我正在使用DT扩展如下 Buttons 下载不同格式的数据 然而虽然Scroller扩展程序也已激活 我只能下载几行 不是
  • Junit 4 测试套件和单独的测试类

    我有一个 JUnit 4 测试套件 其中包含 BeforeClass 和 AfterClass 方法 可以为以下测试类进行设置 拆卸 我需要的是自己运行测试类 但为此我需要为每个测试类提供一个设置 拆卸场景 BeforeClass 和 Af
  • 创建自定义弹出对话框菜单

    我目前正在尝试在单击菜单按钮时实现弹出菜单 如下图所示 我尝试了 popupwindow 方法 但无法实现确切的情况 这就是我正在尝试的方式 private View OnClickListener showPopupWindow retu
  • 我可以保存控制台窗口的缓冲区或内容以供将来使用吗?

    我对控制台应用程序很感兴趣 只是想知道 保存控制台窗口的当前缓冲区以供以后使用并提供某种历史导航功能的最佳方法是什么 我知道 Diagnostics 命名空间提供了读取标准输出的能力 但这只是在您重定向它的情况下进行的 所以基本上您必须在新
  • .htaccess 重写规则冲突

    我正在编写代码并构建一个 htaccess 文件 其中包含以下内容 RewriteEngine on RewriteRule A Za z0 9 A Za z0 9 index php id 1 NC L Handle page reque
  • 计算某个数的某次幂的模(该次幂的数字相当大)

    我想自己计算RSA算法 我需要计算某个数的某个幂的模数 问题是 在一定的功率下 这个数字可能会变得相当大 这就是我想要的 x pow n p q 如何有效地确定 x 如果您使用 NET 4 我建议您查看BigInteger http msd
  • Servlet 从 Amazon S3 读取数据非常慢

    我需要一个 Servlet 来从 Amazon S3 服务器返回文件 只有服务器有访问凭据 S3 存储桶不公开 我无法改变这一点 有人告诉我使用数据流 但它们太慢了 为了进行测试 我有一个带有缩略图的小项目 当您单击一个项目时 它会打开一个
  • 与现有表单完美集成的多文件上传器

    我知道这个问题可能太笼统了 但在花了一整天的时间思考这个问题之后 我对这个问题感到非常困惑 任何人都知道上传插件 那会与现有形式轻松集成 我尝试过的所有上传器插件 jQuery 文件上传 Plupload Uploadify Dropzon
  • Hibernate 实体管理器在查询之前自动刷新并在事务中提交对数据库的更改

    我在 Jboss AS 6 0 0 Final 上使用 Hibernate 3 6 0 和 JPA 2 在我的 EJB 中 有一个方法可以更新实体值并对其进行一些查询 整个方法在BMT事务中运行 如果出现任何问题 所有更改都应该回滚 而不是
  • 缩短node.js和mongoose中的ObjectId

    我的网址目前如下所示 http www sitename com watch companyId 507f1f77bcf86cd799439011 employeeId 507f191e810c19729de860ea someOtherI