2015-08-27 2 views
2

У меня есть MongoDB, где каждая строка имеет дату и время.Метеор: отображение документов, разделенных днями

Database

Я хочу, чтобы выбор из них, скажем, каждую строку с 9, но я также хочу, чтобы отобразить их с разделителя для каждого дня, как:

TODAY: 
-First 
-Second 

IN 3 DAYS 
-Third 
-Fourth 

Так я полагал, что код должен быть

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

Но как я могу отделить документы в своей коллекции по группам, по одному на каждый день?

+0

Можете ли вы уточнить, что вы подразумеваете под «отделять документы в днях»? Вы имеете в виду визуально? –

+0

Я хочу разделить результаты на день на более мелкие части результатов. – JulianWels

ответ

1

Простой поиск нашел это: 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().).

+0

не поддерживается больше. Но я думаю, что это не сработает, потому что времена жизни имеют разные времена в каждый день:/ – JulianWels

+0

Правильно, есть '.distinct()' в родном монго, но не в метеор. Вместо этого используйте символы подчеркивания '_.uniq()'. –

+0

, если поле является дате, как указано, а не просто датой, тогда это не сработает, потому что большинство datetime уже будет отличным, поэтому вы вообще не группируете. Кроме того, мы не хотим ничего исключать (удалить отдельные), но группировать по дате. –

1

Если я правильно понимаю, вы пытаетесь группировать результаты по дням. Вы можете легко сделать это, используя _.groupBy. Вот пример, который может работать:

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

Но вам нужно будет обновить свой шаблон, тоже, чтобы использовать this внутри внешнего each цикла:

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

Ваш вопрос немного расплывчато, но надеюсь, мой ответ поможет вам.

Я создал решение на meteorpad, чтобы вы могли поиграть с ним, чтобы посмотреть, как он работает.

В main.html, list Контент шаблона данных устанавливается по {{#each days}}, являющимся массивом массивов. Вы перебираете внешний массив в этом внешнем цикле #each. Внутренний массив представляет собой простой двухэлементный массив, 0-й элемент которого представляет собой строку «сегодня» или «в день» и т. Д., В то время как первый элемент снова представляет собой массив, содержащий объекты, поступающие из базы данных после группировки по дню, и где значение этого объекта 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 возвращает контексте days данных путем сопоставления, фильтрации, группировки и отображения снова на документы, поступающие из базы данных, используя прикованных underscore.js функции.Первый map устанавливает время до начала данного дня, filter оставляет во внешнем массиве только те документы, которые находятся после определенной даты, затем вы даете group по датам, и, наконец, второй map просто дает вам today на месте строки по умолчанию и оставляет in a day, in 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; 
    } 
}); 

/общие. 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 
     }); 
    }); 
    } 
}); 
Смежные вопросы