Я хочу получить документы в обратном порядке из коллекции в mongoose

#node.js #mongodb #express #mongoose

#node.js #mongodb #экспресс #мангуст

Вопрос:

Я хочу сначала получить последний документ из коллекции mongoose . Я использую mongoose с nodejs/expressjs

Кроме того, я делаю разбивку на страницы на стороне сервера, поэтому я не могу отменить это после выборки.

 exports.getProjects = (req, res, next) => {


const page =  req.query.page || 1; 
let totalItems;
Project
    .find()
    .countDocuments()
    .then(numProducts => {
        totalItems = numProducts;
        return Project.find()
            .skip((page - 1) * ITEMS_PER_PAGE)
            .limit(ITEMS_PER_PAGE)
    })
    .then(result => {
        return res.status(200).json({
            projects: result,
            currentPage: page,
            itemCount: totalItems,
            itemsPerPage: ITEMS_PER_PAGE,
        });
    })
    .catch(err => {
        console.log(err);
    })
 

};

Комментарии:

1. попробуйте опубликовать содержимое кода вместо скриншота.

2. Базы данных обычно не имеют [ориентированного на пользователя] понятия «начало / конец коллекции / таблицы». И я не могу придумать базу данных, которая позволяла бы вам контролировать, куда физически помещается запись в файлах данных. Если вам нужен определенный порядок при чтении данных обратно, используйте явный ORDER BY или эквивалентный.

Ответ №1:

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

 const projectscursor = await Project.aggregate([
{$match:Query},
{$sort:{field:1}},
{$skip:number},
{$limit:somenumber}
]) 
 

Комментарии:

1. Сначала вам нужно выбрать поле типа «createdAt», а затем использовать mongoose .sort({createdAt:-1}) или агрегировать с сортировкой, как в этом примере.

Ответ №2:

Я думаю, вы ищете sort() функцию в mongoose. Вы можете просто отсортировать свою коллекцию, используя любой из следующих методов.

 Project.find({}).sort('test').exec(function(err, docs) { ... });
Project.find({}).sort([['date', -1]]).exec(function(err, docs) { ... });
Project.find({}).sort({test: 1}).exec(function(err, docs) { ... });
Project.find({}, null, {sort: {date: 1}}, function(err, docs) { ... });
 

Попробуйте один из верхних методов в соответствии с вашими требованиями со следующим кодом для правильной разбивки на страницы.

 app.get('/projects', async (req, res) => {
  // destructure page and limit and set default values
  const { page = 1, limit = 10 } = req.query;

  try {
    // execute query with page and limit values
    const projects = await Project.find()
      .sort({ field : criteria})
      .limit(limit * 1)
      .skip((page - 1) * limit)
      .exec();

    // get total documents in the Project collection 
    const count = await Project.countDocuments();

    // return response with posts, total pages, and current page
    res.json({
      projects,
      totalPages: Math.ceil(count / limit),
      currentPage: page
    });
  } catch (err) {
    console.error(err.message);
  }
});
 

Где
критериями могут быть "asc" , "desc" , "ascending" , "descending" , 1 , или -1

Комментарии:

1. Именно это я и искал