【问题标题】:How can I sort a Meteor collection by time of insertion?如何按插入时间对 Meteor 集合进行排序?
【发布时间】: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

标签: mongodb meteor mongodb-query


【解决方案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 会按创建顺序获取文档
猜你喜欢
  • 2020-03-16
  • 1970-01-01
  • 2010-12-09
  • 1970-01-01
  • 1970-01-01
  • 2017-11-20
  • 1970-01-01
  • 2020-07-05
相关资源
最近更新 更多