Hi Serkan, :)
A normal server-side insert should generate timestamps correctly. This is what I've been trending towards when I want a collection that has timestamps.
// model.js file
Posts = new Meteor.Collection("posts", {idGeneration : 'MONGO'});
// client
Meteor.call('insertPost), newPostObjectInfo, function(error,result){
console.log(result);
});
// server
Meteor.call('insertPost', function(newPostObjectInfo){
Posts.insert({name: newPostObjectInfo.name, owner: newPostObjectInfo.owner});
return 'success';
}')
As for the client side Id creation, be careful of almost and practically non-existent. The _ids have to be unique, and will be rejected if they're not. If you can handle some posts or inserts being rejected, and are willing to take that chance... then, sure. From my experience, that's a kind of design decision that can result in a Heisenbug later down the road, where one out of a million transaction fails. But if you're handling 100,000 users, and they have 100 transactions a month, then you're going to start collection dozens of errors. And the problem grows from there.
As to how to decide which to use, again... it boils down to data topology. And queries. Look at how your data is queried, and how the data is structured. That forms it's topology. Uniqueness, auto-incrementation, spatial organization, normalized hashes, timeseries... the index types are your guide to topology. Ask yourself how you want to index your data, and what kind of indexing you want to do. The question of String or ObjectId is a single instance of the broader and bigger question of how to Index the data.
Any data that you want to display in a timeline or chronologically are very likely to want to have a timestamp. (It's one of the most ubiquitous ways to display data. Think Twitter, Facebook, Quickbooks... anything that you can sort by date.) On the other hand, geospatial location data usually has no need for timeseries indexing, since its spatial in nature. And geolocation data often doesn't even need to be unique. Alternatively, user accounts data is an example of something that needs uniqueness, doesn't need to be a timeseries data, but doesn't hurt if it's timeseries either.
As for the findAndModify, it's one of the lesser used MongoDB functions, and requires the uniqueness constraint. Read through this doc for a discussion of what happens when a non-unique _id is used: