如何按插入时间对 Meteor 集合进行排序?

Posted

技术标签:

【中文标题】如何按插入时间对 Meteor 集合进行排序?【英文标题】:How can I sort a Meteor collection by time of insertion? 【发布时间】:2012-12-07 02:50:32 【问题描述】:

我正在使用 Meteor 进行我的第一个项目,但在排序时遇到了一些困难。

我有一个表单,用户可以在其中输入格言,然后将格言显示在列表中。目前最新的格言会自动显示在列表的底部。有没有一种简单的方法可以让最新的出现在列表顶部?

我试过了:

   Template.list.aphorisms = function () 
    return Aphorisms.find(, sort: $natural:1);
;

我很困惑,因为 Meteor 文档没有太多示例。

【问题讨论】:

您可以随时添加 date_created 属性并按此排序。 你的收藏怎么样? 我确实添加了一个 date_created 属性...我希望 MongoDB 不必这样做... 默认的 _id 字段已经按创建时间键控(请参阅:如何生成 Mongo ObjectID)。您可以按相反的顺序对其进行排序,而无需添加其他字段。 我担心 Meteor 使用自己的没有时间戳部分的 ObjectID 【参考方案1】:

假设date_created 与时间戳一起采用有效的日期格式,您应该使用Date.parse() javascript 函数插入date_created 的解析值,该函数给出1970 年1 月1 日和日期之间的毫秒数date_created 中包含的值。

因此,最近添加的记录所包含的 date_created 值将大于插入它之前的记录。

现在在获取记录时,将光标按date_created 参数的降序排序为:

 Aphorisms.find(, sort: date_created: -1);

这会将记录从新到旧排序。

希望这会有所帮助。

【讨论】:

这很好用..我目前只能以一种有效的方式存储日期的唯一方法是:var combinedTime = year + "" + day + "" + month + "" + 小时 + "" + 分钟 + "" + 秒; 是的,确保date_created 属性也包含有效的时间戳。因为这仅适用于 date+month+year 为了在 minimongo 客户端对日期进行排序,日期必须存储为字符串,例如 ISO8601 格式。 Minimongo 不知道如何对日期类型进行排序。见docs.meteor.com/#collections下的红色文字 自 12 年以来发生了一些变化:date_created 现在是 createdAt【参考方案2】:

我发现以下是更清洁的解决方案:

   Template.list.aphorisms = function () 
      return Aphorisms.find().fetch().reverse();
   ;

鉴于整个集合已经以您想要的相反顺序存在,您可以简单地创建一个包含所有对象的数组并反转顺序。

【讨论】:

我不确定您是否真的可以依靠 Mongo 来整理您的物品。从理论上讲,是的,这是可行的——但据我所知,这并不总是一个安全的假设。 这是最安全的解决方案。 MongoDB 默认在 Meteor 中自动创建 createdAt 字段。因此,在进行大型查询时,这实际上是最安全、最干净的解决方案。 嗨,createdAt 字段不是自动创建的(也许是在您发表评论时,我使用的是 1.4.2)。您必须自己处理它,通常要感谢aldeed:collection2 包。我不确定为什么这不是默认行为,就像猫鼬或其他语言一样。 你不能相信 find 会按创建顺序获取文档

以上是关于如何按插入时间对 Meteor 集合进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MongoDB 中按日期对集合进行排序?

如何按创建日期而不是名称对 Cloud Firestore 集合中的文档进行排序?

Collections排序

如何在laravel中检索有限数量的相关模型并按相关模型对集合进行排序?

Meteor:使用 reactiveVar 观察集合

如何对List集合中的对象进行按某个属性排序