【发布时间】:2015-03-28 23:37:14
【问题描述】:
我正在使用 Meteor 从 Mongo 检索记录。我在我的流星模板中使用 {{_id}} 占位符来使用记录的 _id 字段,但它会将它添加到我的模板中......
ObjectID("54f27a1adfe0c11c824e04e9")
...我只想拥有...
54f27a1adfe0c11c824e04e9
我该怎么做?
【问题讨论】:
我正在使用 Meteor 从 Mongo 检索记录。我在我的流星模板中使用 {{_id}} 占位符来使用记录的 _id 字段,但它会将它添加到我的模板中......
ObjectID("54f27a1adfe0c11c824e04e9")
...我只想拥有...
54f27a1adfe0c11c824e04e9
我该怎么做?
【问题讨论】:
只需添加一个全局帮助器:
Template.registerHelper('formatId', function(data) {
return (data && data._str) || data;
});
你也可以使用 ES6 语法来做到这一点:
Template.registerHelper('formatId', (id) => (id && id._str) || id);
并在任何模板中使用它:
{{formatId _id}}
这适用于 mongo 样式的 ObjectId 和流星样式的随机字符串。
【讨论】:
由于您的文档使用的是 MongoDB ID 格式而不是默认的 Meteor ID 格式(只是一个随机生成的字符串),因此您需要使用 here 中描述的 MongoDB ObjectId.toString() 函数。但不幸的是,这只会导致您的 ObjectID 被打印为像 ObjectID("54f27a1adfe0c11c824e04e9") 这样的字符串。
我建议创建一个文档 ID 模板帮助程序,用于在将文档 ID 包含在模板中之前对其进行清理。由于此问题很可能与您所有集合中的所有文档有关,因此我会进一步建议创建一个全局模板助手。可以这样做:
Template.registerHelper('cleanDocumentID', function(objectID) {
var objectIdString = objectID.toString();
var cleanedString = objectIDString.slice(objectIDString.indexOf('"') + 1, -2);
return cleanedString;
});
此模板助手从ObjectId.toString() 函数提供的字符串中仅切出实际的对象ID 字符串。您可以像这样在模板中使用此模板助手:
{{cleanDocumentID _id}}
我知道这比在模板中简单地使用文档 ID(如 {{_id}})要麻烦得多,但这是必要的,因为您的文档具有 MongoDB ObjectID 类型的文档 ID,而不是简单的随机生成Meteor 默认使用的字符串。
如果您想详细了解如何将 MongoDB 集合设置为使用随机生成的字符串作为文档 ID 并避免这种混乱,请查看 this。
【讨论】:
在 Blaze 模板中,只需添加此 {{_id.valueOf}},您将获得实际 Object Id 的字符串值。
【讨论】:
mongo 能够存储多种类型,包括 uuid 和自定义类型。该字段通常是一个自描述对象,由类型和 id 组成。
您的记录使用的是由“ObjectId”前缀证明的默认 mongo 格式。
试试ObjectId("507f191e810c19729de860ea").str
【讨论】: