2016-02-01 2 views
2

При создании моего первого приложения Meteor я нашел то, что я даже не знаю, как подойти. У меня есть список записей в коллекции, и я хочу классифицировать их по дате (не сортировать по дате). Каждая запись имеет дату, и я хочу построить что-то вроде временной шкалы. Вот как один из этих записей выглядят следующим образом:Классификация записей из коллекции

{ 
    "_id": "xHmfEc5gMmGzDZgD2", 
    "title": "sth", 
    "labels": [ 
    "pv4LnWNheyYRJqG7D" 
    ], 
    "images": [ 
    "zitE3FwmesHsNCxGG", 
    "kYQTJYApDxPr4sMdW", 
    "4enopyawfqBXRDvuh" 
    ], 
    "author": "TMviRL8otm3ZsddSt", 
    "createdAt": "2016-01-31T21:05:55.401Z", 
    "date": "2016-01-31T21:05:55.401Z", 
    "description": "desc" 
} 

В конце концов, я хочу чего-то добиться, как график, и я хочу, чтобы запись принадлежать день. Вот как это может выглядеть на временной шкале разделения по дням, каждая запись, принадлежащая к дню:

день - 11.02.2016

вход - xHmfEc5gMmGzDZgD2

вход - ZhmfEc5gMmGzDZg8z

запись - uafEc5gMmGzDZgD25

день - 12.02.2016

вход - xHmfEc5gMmGzDZgD2

вход - ZhmfEc5gMmGzDZg8z

день - 17.02.2016

вход - xHmfEc5gMmGzDZgD2

вход - ZhmfEc5gMmGzDZg8z

вход - xHmfEc5gMmGzDZgD2

запись - ZhmfEc5gMmGzDZg8z

Но я хочу получить дни из записей, а не создавать отдельную коллекцию для календаря. Если это возможно ....

Что было бы хорошим способом достичь этого?

Единственный способ, которым я могу представить это на данный момент, - хранить все разные даты от записей в отдельной коллекции, а затем каждый день должен запрашивать коллекцию записей, чтобы получить те, которые подходят. Но я думаю, что это очень плохой способ сделать это, как на каждый день, у меня будет запрос DB ....

+0

Является ли поле 'date' фактической строкой или объектом datetime? – chridam

+0

Это объект даты. – Skkyp

ответ

2

Вы можете использовать aggregation framework для этого, а потому, что агрегат пока не поддерживается в метеор, вам нужно установить пакет рамок агрегации - он не делает ничего, чтобы представить себя, просто завершает некоторые монгольские методы для вас.

Только метеор добавить meteorhacks:aggregate и вы должны быть в бизнесе. Это добавит правильную поддержку агрегации для Meteor.

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

var pipeline = [ 
    { 
     "$project": { 
      "yearMonthDay": { "$dateToString": { "format": "%Y-%m-%d", "date": "$date" } },   
     } 
    }, 
    { 
     "$group": { 
      "_id": "$yearMonthDay", 
      "entries": { "$push": "$_id" } 
     } 
    } 
]; 

db.entry.aggregate(pipeline); 

В Метеоре, вы можете опубликовать эти результаты в коллекцию записей на стороне клиента:

Meteor.publish('getDayCategorisedEntries', function (opts) { 

    var initializing = 1; 

    function run(action) { 

     // Define the aggregation pipeline (aggregate(pipeline)) 
     var pipeline = [ 
      { 
       "$project": { 
        "yearMonthDay": { "$dateToString": { "format": "%Y-%m-%d", "date": "$date" } },   
       } 
      }, 
      { 
       "$group": { 
        "_id": "$yearMonthDay", 
        "entries": { "$push": "$_id" } 
       } 
      } 
     ]; 

     Entries.aggregate(pipeline).forEach(function(e){ 
      this[action]('day-entries', e._id, e) 
      this.ready() 
     }); 
    }; 

    // Run the aggregation initially to add some data to your aggregation collection 
    run('added'); 

    // Track any changes on the collection we are going to use for aggregation 
    var handle = Entries.find({}).observeChanges({ 
     added(id) { 
      // observeChanges only returns after the initial `added` callbacks 
      // have run. Until then, we don't want to send a lot of 
      // `self.changed()` messages - hence tracking the 
      // `initializing` state. 
      if (initializing && initializing--) run('changed'); 
     }, 
     removed(id) { 
      run('changed'); 
     }, 
     changed(id) { 
      run('changed'); 
     }, 
     error(err) { 
      throw new Meteor.Error('Uh oh! something went wrong!', err.message) 
     } 
    }); 

    // Stop observing the cursor when client unsubs. 
    // Stopping a subscription automatically takes 
    // care of sending the client any removed messages. 
    this.onStop(function() { 
     handle.stop(); 
    }); 
}); 

выше отмечает изменения, и при необходимости повторной агрегации.

+1

Благодарим вас за ответ и ссылки. Вся вещь «агрегации» для меня нова, но, похоже, именно то, что мне нужно. – Skkyp

+0

@Skkyp Не стоит беспокоиться, по крайней мере, это должно привести вас к ускорению с помощью структуры агрегации, которая может упростить некоторые сложные операции агрегации. – chridam

Смежные вопросы