在 node.js 和 mongoose 中缩短 ObjectId
Shorten ObjectId in node.js and mongoose
我的 URL 目前看起来像这样:
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
但我没有看到它被使用太多,所以我无法判断它是否可靠。
有人有什么建议吗?
我最后是这样的:
安装 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}
});
编辑:
现在您可以使用性能更高且经过优化的 nanoid 库。文档也很好:https://github.com/ai/nanoid/
所有现有模块都使用 64 个字符 table 进行转换。所以他们必须在字符集中使用“-”和“_”字符。当您通过 Twitter 或 Facebook 分享短 url 时,它会导致 url 编码。所以要小心。
我使用我自己的短 id 模块 id-shorter 没有这个问题,因为它使用字母数字集进行转换。
祝你成功!
我的 URL 目前看起来像这样:
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 但我没有看到它被使用太多,所以我无法判断它是否可靠。
有人有什么建议吗?
我最后是这样的:
安装 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}
});
编辑: 现在您可以使用性能更高且经过优化的 nanoid 库。文档也很好:https://github.com/ai/nanoid/
所有现有模块都使用 64 个字符 table 进行转换。所以他们必须在字符集中使用“-”和“_”字符。当您通过 Twitter 或 Facebook 分享短 url 时,它会导致 url 编码。所以要小心。 我使用我自己的短 id 模块 id-shorter 没有这个问题,因为它使用字母数字集进行转换。 祝你成功!