#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. Именно это я и искал