gpt4 book ai didi

javascript - 在 MongoDB 聚合中返回带数据的计数

转载 作者:搜寻专家 更新时间:2023-10-30 23:25:51 26 4
gpt4 key购买 nike

我编写了一个使用多个阶段的 MongoDB 聚合查询。最后,我希望查询以下列格式返回我的数据:

{
data: // Array of the matching documents here
count: // The total count of all the documents, including those that are skipped and limited.
}

我将使用跳过和限制功能来最终削减结果。但是,我想知道我跳过和限制它们之前返回的文档数量。据推测,管道阶段必须发生在 $match 阶段之后但在 $skip$limit 阶段之前的某个地方。

这是我目前编写的查询(它在 express.js 路由中,这就是我使用这么多变量的原因:

const { 
minDate,
maxDate,
filter, // Text to search
filterTarget, // Row to search for text
sortBy, // Row to sort by
sortOrder, // 1 or -1
skip, // rowsPerPage * pageNumber
rowsPerPage, // Limit value
} = req.query;



db[source].aggregate([
{
$match: {
date: {
$gt: minDate, // Filter out by time frame...
$lt: maxDate
}
}
},
{
$match: {
[filterTarget]: searchTerm // Match search query....
}
},
{
$sort: {
[sortBy]: sortOrder // Sort by date...
}
},
{
$skip: skip // Skip the first X number of doucuments...
},
{
$limit: rowsPerPage
},
]);

感谢您的帮助!

最佳答案

我们可以使用facet在数据上运行并行管道,然后合并每个管道的输出。

以下是更新后的查询:

db[source].aggregate([
{
$match: {
date: {
$gt: minDate, // Filter out by time frame...
$lt: maxDate
}
}
},
{
$match: {
[filterTarget]: searchTerm // Match search query....
}
},
{
$set: {
[filterTarget]: { $toLower: `$${filterTarget}` } // Necessary to ensure that sort works properly...
}
},
{
$sort: {
[sortBy]: sortOrder // Sort by date...
}
},
{
$facet:{
"data":[
{
$skip: skip
},
{
$limit:rowsPerPage
}
],
"info":[
{
$count:"count"
}
]
}
},
{
$project:{
"_id":0,
"data":1,
"count":{
$let:{
"vars":{
"elem":{
$arrayElemAt:["$info",0]
}
},
"in":{
$trunc:"$$elem.count"
}
}
}
}
}
]).pretty()

关于javascript - 在 MongoDB 聚合中返回带数据的计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58036415/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com