Как получить следующий и предыдущий элемент текущего с помощью Mongoose - PullRequest
9 голосов
/ 06 февраля 2012

У меня есть блог. На отдельной странице поста я хочу отобразить ссылку на предыдущий, а если он есть, следующий пост будет опубликован внизу. Ссылка должна быть названием конкретного сообщения.

Как мне сделать это самым простым способом с Mongoose?

Мой текущий контроллер выглядит так:

Post.findOne { slug : req.params.slug }, (err, post) ->
  res.render "blog/show.jade", locals: title: "This post", post: post

И схема выглядит так:

PostSchema = new Schema(
  title:
    type: String
    required: true
    index: true
  preamble: String
  body: String
  slug: String
  createdAt: Date
  updatedAt: Date
)

Ответы [ 2 ]

16 голосов
/ 06 февраля 2012

Итак, давайте предположим, что у вас есть схема, подобная этой:

{
 _id,
 text    
}

Я полагаю, что _id - это mongo ObjectId, поэтому он содержит дату публикации, и я могу отсортировать по ней

Давайте рассмотрим, чтоЯ открыл текущий пост с идентификатором, равным ObjectId( "43cc63093475061e3d95369d") (вместо этого я буду использовать curId), и мне нужно знать следующий и предыдущий.Также давайте рассмотрим, что нам нужно получать все посты один за другим, упорядоченные по дате создания по убыванию:

Получить следующий пост вы можете следующим образом:

db.posts.find({_id: {$gt: curId}}).sort({_id: 1 }).limit(1)

Получить предыдущий пост вы можете следующим образом:

db.posts.find({_id: {$lt: curId}}).sort({_id: -1 }).limit(1)

Несколько вещей:

  1. Если вы не используете mongodb ObjectId выше, код не будет работать для вас, но вы все равно можете использовать postDate вместо id итекущая запись postDate вместо curId.
  2. Позаботьтесь о порядке при получении следующей / предыдущей записи, чтобы получить следующую запись, вам нужна сортировка asc, для получения предыдущей записи вам нужна сортировка desc.
  3. Я не знаком с mongoose, поэтому приведенные выше сценарии - это сценарии оболочки mongodb.
1 голос
/ 11 февраля 2017

Найти предыдущий предмет:

Post.findOne({_id: {$lt: curId}}).sort({_id: -1}).exec(cb)

Найти следующий предмет:

Post.findOne({_id: {$gt: curId}}).sort({_id: 1}).exec(cb)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...