Loading...
dimityr.jechev avatar dimityr.jechev 198 Точки

[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 198 Точки

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

0
aivian avatar aivian 51 Точки

А имате ли идея защо, предвид, че няма поле 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 198 Точки

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

0
IVANMARINOV1975 avatar IVANMARINOV1975 19 Точки

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

0
evgenikolov avatar evgenikolov 304 Точки

Някой пребори ли 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
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.