如何使用mongodb聚合进行分页



在MongoDB上工作时。我在进行分页时遇到了问题。当我试图将Paginaiton包含在aggerate中时。我还试图将facets包含在其中。

我的代码:只用于搜索

app.get("/search", async(req, res) => {
try {
const text = req.query.text
let result = await collection.aggregate([                    
{
'$search': {
'text': {
'query': `${text}`,
'path': 'title'
}
}
}
]).toArray();
res.send(result)
} catch (error) {
console.error(error)
}
})

这对searchpagination都有效。就像这样,看,它不需要任何可选的request.query.page

http://localhost:4000/search?text=mango
http://localhost:4000/search?text=mango?page=1


现在,我想将pagination也包括在facets搜索中。。。所以,

server.get("/search", async(req, res) => {
try {
const key = req.query.key;
const value = req.query.value; 
const text = req.query.text;
const page = req.query.page; //Page query create
let result = await collection.aggregate([                    
{
'$search': {
'text': {
'query': `${text}`,
'path': 'title'
}
}
},
{
'$match': {
[key]: `${value}`
}
}
]).toArray();
res.send(result)
} catch (error) {
console.error(error)
}
})

为此工作没有页数

http://localhost:4000/search?text=Mango&key=Brand&value=rasna

不适用于分页

http://localhost:4000/search?text=Mango&key=Brand&value=rasna&page=2

我错在哪里了?我需要创建任何额外的function来使其工作吗?

您可以同时使用$skip和$limit聚合管道来实现此目的。想象一下,我们希望每页只有20个项目。所以我们的代码看起来是这样的:

server.get("/search", async(req, res) => {
try {
const key = req.query.key;
const value = req.query.value; 
const text = req.query.text;
const page = req.query.page - 1; //We subtract one because we don't want skip first twenty items in first page
let result = await collection.aggregate([                    
{
'$search': {
'text': {
'query': `${text}`,
'path': 'title'
}
}
},
{
'$match': {
[key]: `${value}`
}
},
{ $skip: page * 20 },
{ $limit: 20 }
]).toArray();
res.send(result)
} catch (error) {
console.error(error)
}
})

最新更新