【问题标题】:Meteor: Displaying documents separated by DaysMeteor:显示按天分隔的文档
【发布时间】:2015-11-22 04:13:52
【问题描述】:

我有一个 MongoDB,其中每一行都有一个日期时间和一个名称。

我想要选择它们,比如说从第 9 行开始的每一行,但我也想用分隔符显示它们,例如:

TODAY:
-First
-Second

IN 3 DAYS
-Third
-Fourth

所以我认为代码必须是这样的

{{#each day}}
    <h1>{{day}}</h1>
    {{#each entrie}}
        <p>entrie</p>
    {{/each}}
{{/each}}

但是如何将我收藏中的文档分成几组,每天一组?

【问题讨论】:

  • 您能详细说明“在几天内分隔文件”是什么意思吗?你是说视觉上的吗?
  • 我想将每天的结果分成更小的部分。

标签: javascript mongodb meteor


【解决方案1】:

你的问题有点模糊,但希望我的回答对你有所帮助。

我在meteorpad 上创建了一个解决方案,您可以使用它来看看它是如何工作的。

main.html 中,list 模板的数据上下文由{{#each days}} 设置,这是一个数组的数组。在这个外部 #each 循环中遍历外部数组。内部数组是一个简单的 2 元素数组,其第 0 个元素是字符串“today”或“in a day”等,而第一个元素又是一个数组,其中包含按天分组后来自数据库的对象,并且这些对象的 item 值显示在给定日期的每个项目的内部 {{#each this.[1]}} 循环中。

// main.html
<body>
  {{> list}}
</body>

<template name='list'>
    {{#each days}}
        {{this.[0]}}
        {{#each this.[1]}}
            <div>{{item}}</div>
        {{/each}}
        <br>
    {{/each}}
</template>

/client/app.js 通过使用链式underscore.js 函数映射、过滤、分组和再次映射来自数据库的文档,返回days 数据上下文。第一个 map 将时间设置为给定日期的开始,filter 仅将特定日期之后的文档留在外部数组中,然后是日期 group,最后是第二个 @ 987654335@ 只是给你today 代替默认字符串,并保留in a dayin 2 days 等字符串。

此外,在包含的 moment.js 包中,您可以重置时差阈值,以便始终以天为单位测量时差,而不是默认的秒、分钟、小时等。

// client/app.js
moment.relativeTimeThreshold('h', 0);
moment.relativeTimeThreshold('s', 0);
moment.relativeTimeThreshold('m', 0);

Template.list.helpers({
   days: function() {
            var ret =  _.chain(Days.find().fetch())
                            .map(function(day) {
                                 return {_id: day._id, dateTime: moment(day.dateTime).startOf('day')._d, item: day.item};
                            })
                            .filter(function(day) {
                                 return moment(day.dateTime) >= moment([2015,7,5])
                            })
                            .groupBy(function(day) {
                                 return moment(day.dateTime).from([2015, 7, 4]);
                            })
                            .map(function(v, k) {return k === "1 days ago" ? ["today", v] : [k, v]})
            return ret._wrapped;
    }
});

/common.js 在数据库days 集合上创建Days 句柄。

// common.js
Days = new Mongo.Collection("days");

/server/app.js 只是将一些文档注入到数据库中。

// server/app.js
Meteor.startup(function () {
  if (Days.find().count() === 0) {
    var entries = [
      {
        dateTime: new Date('2015-08-04 09:01:01'),
        item: "-Zeroth"
      },
      {
        dateTime: new Date('2015-08-05 11:01:01'),
        item: "-First"
      },
      {
        dateTime: new Date('2015-08-05 17:02:11'),
        item: "-Second"
      },
      {
        dateTime: new Date('2015-08-09 12:11:07'), 
        item: "-Third"
      },
      {
        dateTime: new Date('2015-08-09 21:23:18'),
        item: "-Fourth"
      }
    ];
    _.each(entries, function (entry) {
      Days.insert({
        dateTime: entry.dateTime,
        item: entry.item
      });
    });
  }
});

【讨论】:

    【解决方案2】:

    如果我理解正确,您正在尝试按天对结果进行分组。您可以使用_.groupBy 轻松做到这一点。这是一个可能有效的示例:

    Template.myTemplate.helpers({
       days: function() {
          return _.groupBy(MyCollection.find().fetch(), function(day) {
              return Date(day.datetime).getDay();
          });
       }
    });
    

    但您也需要更新您的模板,以便在外部 each 循环内使用 this

    {{#each days}}
        {{#each this}}
           <div>{{name}}</div>
        {{/each}}
    {{/each}}
    

    【讨论】:

      【解决方案3】:

      简单搜索发现:Does Meteor have a distinct query for collections?Meteor - collection.find() always returns all fields

      您可以像这样从您的收藏中找到独特的日期:

      MyCollection.find({}, {fields: {'date': 1}}).distinct('date', true);
      

      然后您可以指定一个名为days 的函数来返回这些特定日期。然后就像上面的示例所示,您可以执行以下操作:

      {{#each days}}
          {{this}}
          {{#each names}}
             <p>{{this}}</p>
          {{/each}}
      {{/each}}
      

      您可以指定名称以查找集合中日期为当天的名称(即this.valueOf())。

      【讨论】:

      • distinct 不再受支持。但我认为它无论如何都行不通,因为日期时间每天都有不同的时间:/
      • 正确,原生 mongo 中有 .distinct(),但流星中没有。请改用下划线_.uniq()
      • 如果该字段是一个日期时间,如前所述,而不仅仅是一个日期,那么这将不起作用,因为大多数日期时间已经是不同的,所以你最终根本没有分组。此外,我们不想消除任何东西(删除不同的),而是按日期分组。
      • 嗯,你总是可以使用_.uniq(),然后构建一个字典,将日期(不包括时间)映射到name的列表
      猜你喜欢
      • 1970-01-01
      • 2010-09-24
      • 2018-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-20
      • 1970-01-01
      • 2015-10-10
      相关资源
      最近更新 更多