Софтуерно Инженерство
Loading...
+ Нов въпрос
dimityr.jechev avatar dimityr.jechev 196 Точки

[Workshop] Как се сортират въпросите по датата на техните отговори

Здравейте, някой може ли  да ми каже как се сортират въпростите по датите на техните отговори?
Това е моята схема на въпросите 
var threadSchema = mongoose.Schema({
  title: {
    type: String,
    required: true
  },
  description: {
    type: String,
    required: true
  },
  author: {
    type: mongoose.Schema.Types.ObjectId,
    ref: 'User'
  },
  publishTime: {
    type: Date,
    default: Date.now
  },
  answers: [{
    type: mongoose.Schema.Types.ObjectId,
    ref: 'Answer'
  }]
})

Тагове:
0
Express.js Web Development
IVANMARINOV1975 avatar IVANMARINOV1975 19 Точки
Best Answer

Аз бих го направил така:

Answers-{description,thread_id,user_id}

Thread-{title,description,lastAnswerDate}

Всеки път когато въвеждаш Answer и го добавяш към Answers сменяш и lastAnswerDate на съответния Thread.

Тогава сортирането вече е лесно:

Thread.find({}).sort({lastAnswerDate:' desc'}).exec().then().............

3
dimityr.jechev avatar dimityr.jechev 196 Точки

Благодаря много :)

0
aivian avatar aivian 50 Точки

А имате ли идея защо, предвид, че няма поле lastAnswerDate, а само масив от answer, сортиране с { 'answers.creationDate': -1 } не работи?

0
IVANMARINOV1975 avatar IVANMARINOV1975 19 Точки

 Ако имаш :

thread1{ title, description, answers:[ {description:..,creationDate:'2012-05-05 '}, {description:...,creationDate:'2013-05-05 '},     ]

thread2{ title, description, answers:[ {description:..,creationDate:'2014-05-05 '}, {description:...,creationDate:'2015-05-05 '},     ]

Как твоето сортиране ще разбере че трябва да вземе най-новата дата от thread1 и най-новата дата от thread2 ,за да сортира по тези "най-нови дати" thread -овете?.Според мен логиката се губи при това сортиране.Гледах в нета няколко варианта.Примерно може да си добавиш поле lastAnswerDate и масива answer да си остане.Всеки път като добавяш в answer променяш lastAnswerDate на най-новата дата на добавения answer.И сортираш като съм посочил долу.Масива answer си остава и не ти променя твоята логика.

 

 

0
04/11/2016 15:37:25
dimityr.jechev avatar dimityr.jechev 196 Точки

А тоя pagination как се прави ?Може ли да видя и във view-то ,че ужас...

0
IVANMARINOV1975 avatar IVANMARINOV1975 19 Точки

Не съм го правил още.Тази вечер ще го умувам.В нета пише много неща.Ако никой не е писал до тогава ще споделя какво съм открил:)

0
evgenikolov avatar evgenikolov 310 Точки

Някой пребори ли pagination-a? Ако може да споделите някакви варианти ще е супер. 

0
IVANMARINOV1975 avatar IVANMARINOV1975 19 Точки

След дълго ровене открих нещо много елегантно.Без допълнителни пакети и т.н.Прераборих си го сам.При мен работи, разгледайте го и вие за грешки:).

Контролер:

paging: (req, res) => {
    let next
    let prev
    let page = parseInt(req.params['page']) || 1
    let num = page * 20
    Thread.count({})
    .then(total => { let pages = Math.ceil(total / 20)
      if (num < total) { next = true }
      if (num > 20) { prev = true }
      Thread.find({}).sort({lastAnswerDate: 'desc'}).skip(20 * (page - 1)).limit(20)
      .exec()
      .then(t => {
        if (page > pages) { res.redirect('/pages/' + pages) }
        res.render('threads/paging', { page: page, prev: prev, next: next, threads: t })
      })
    })
  }

View:

ul.list
  each val in threads
    li=val.title
if (prev)
  a(href="/pages/"+(page - 1) ) Previous
if (next)
  a(href="/pages/"+ (page + 1) ) Next  

 Router:

app.get('/pages/:page', controllers.threads.paging)

В работен вариант е но мисля че върши работа..

1
threadSchema.find( { $query: { publishTime: publishTime }, $orderby: { publishTime } } function ( results ) {
    ...
})
0