4

考虑到如果没有指定排序,MongoDB 不保证按插入顺序返回项目,文档的 _id 是随机生成的,并且在插入时手动设置时间戳取决于客户的时钟?

4

2 回答 2

6

我建议一个方法。

Meteor.methods({
  addItem: function (doc) {
    doc.when = new Date;
    return Items.insert(doc);
  }
});

虽然客户端将在本地运行并设置when为自己的当前时间,但服务器的时间戳优先并传播到所有订阅的客户端,包括原始客户端。你可以排序doc.when

作为文档验证和权限的一部分,我们可能会添加自动设置时间戳的钩子。

于 2012-05-05T21:29:02.550 回答
1

如果您愿意使用这些收集钩子(https://gist.github.com/matb33/5258260)之类的东西,以及这个奇特的Date.unow功能(即使插入了许多具有相同时间戳的文档,您也可以安全地对其进行排序):

if (!Date.unow) {
    (function () {
        var uniq = 0;
        Date.unow = function () {
            uniq++;
            return Date.now() + (uniq % 5000);
        };
    })();
}

if (Meteor.isServer) {
    // NOTE: this isn't vanilla Meteor, and sometime in the future there may be
    // a better way of doing this, but at the time of writing this is it:
    Items.before("insert", function (userId, doc) {
        doc.created = Date.unow();
    });
}
于 2013-03-27T22:58:42.087 回答