在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)
}
})
这对search
和pagination
都有效。就像这样,看,它不需要任何可选的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)
}
})