JoeTidee
JoeTidee

Reputation: 26054

Need to remove ObjectID() from _id using Meteor

I am retrieving records from Mongo using Meteor. I use the {{_id}} placeholder in my meteor template to use the _id field of the record, but it adds this into my template....

ObjectID("54f27a1adfe0c11c824e04e9")

... and I would like just to have...

54f27a1adfe0c11c824e04e9

How do I do this?

Upvotes: 6

Views: 2176

Answers (4)

securecurve
securecurve

Reputation: 5807

In Blaze templates, just add this {{_id.valueOf}}, and you will have a string value of the actual Object Id.

Upvotes: 1

David Weldon
David Weldon

Reputation: 64312

Just add a global helper:

Template.registerHelper('formatId', function(data) {
  return (data && data._str) || data;
});

You can also do it like this with ES6 syntax :

Template.registerHelper('formatId', (id) => (id && id._str) || id);

And use it in any template like this:

{{formatId _id}}

This will work for both mongo-style ObjectIds and meteor-style random strings.

Upvotes: 11

Keith Dawson
Keith Dawson

Reputation: 1495

Since your documents are using the MongoDB ID format rather than the default Meteor ID format (simply a randomly generated string), you will need to use the MongoDB ObjectId.toString() function described here. But unfortunately, this simply results in your ObjectID being printed out as a string like ObjectID("54f27a1adfe0c11c824e04e9").

I would recommend creating a document ID template helper that cleans your document IDs before including them in the template. Since this issue is most likely related to all of your documents in all of your collections, I would further suggest creating a global template helper. This can be done like so:

Template.registerHelper('cleanDocumentID', function(objectID) {
    var objectIdString = objectID.toString();
    var cleanedString = objectIDString.slice(objectIDString.indexOf('"') + 1, -2);

    return cleanedString;
});

This template helper slices out just the actual object ID string from the string provided by the ObjectId.toString() function. You can use this template helper in your templates like so:

{{cleanDocumentID _id}}

I know that this is a lot messier than simply using the document ID in the template like {{_id}}, but it is necessary due to the fact that your documents have the MongoDB ObjectID-type document ID rather than the simple randomly generated string as used by Meteor by default.

If you would like to learn more about how to set your MongoDB collections to use randomly generated strings for document IDs and avoid this mess, check out this.

Upvotes: 1

Gabe Rainbow
Gabe Rainbow

Reputation: 3738

mongo is capable of storing many types including uuids and custom ones. the field is usually a self-describing object, comprised of the type and the id.

your record is using the default mongo format evidenced by the "ObjectId" prefix.

try ObjectId("507f191e810c19729de860ea").str

Upvotes: 0

Related Questions