我很难使用聚合来获得两个变量。在我的集合中,我希望通过createdAt过滤出某些文档,并将每个匹配的文档推入一个数组变量中。
在此之后,我还希望有第二个变量,它显示匹配的文档数量的计数。
我设法在它们自己的聚合中将它们分开,但不知怎么我不能将它们组合在一起,在一个聚合中工作。
对象数组的一个:
const data = await MyList.aggregate([
{
$match: {
createdAt: { $lt: new Date(myDate) }
}
},
{ $limit: 10 },
{ $skip: 20 }
]);供计数的:
const data = await MyList.aggregate([
{
$match: {
createdAt: { $lt: new Date(myDate) }
}
},
{
$group: {
_id: null,
count: { $sum: 1 }
}
},
{ $limit: 10 },
{ $skip: 20 }
]);因此,我想在数据变量中得到这样的内容:
{
items: [ {...}, {...}, ...],
count: 24
}发布于 2019-11-20 12:33:58
如果mongodb服务器版本等于或大于3.4,则可以使用$facet聚合:
const data = await MyList.aggregate([
{
$match: {
createdAt: { $lt: new Date(myDate) }
}
},
{
$facet: {
items: [{ $skip: 0 }, { $limit: 10 }],
count: [
{
$count: "count"
}
]
}
}
]);这将给出如下结果:(项目将有10项,但计数将是符合标准的文档总数)
[
{
"items": [
{
"_id": "5dd5182d45409447308379df",
"createdAt": "2019-11-20T10:40:21.040Z",
"name": "a1",
"__v": 0
},
{
"_id": "5dd5183345409447308379e0",
"createdAt": "2019-11-20T10:40:21.040Z",
"name": "a2",
"__v": 0
},
...
...
{
"_id": "5dd5185545409447308379e8",
"createdAt": "2019-11-20T10:40:21.040Z",
"name": "a10",
"__v": 0
}
],
"count": [
{
"count": 21
}
]
}
]您可以这样重塑这些数据:
let result = {
items: [],
count: 0
};
if (data && data[0] && data[0].items.length) {
result = {
items: data[0].items,
count: data[0].count[0].count
};
}结果如下:(客户端更容易解析)
{
"items": [
{
"_id": "5dd5182d45409447308379df",
"createdAt": "2019-11-20T10:40:21.040Z",
"name": "a1",
"__v": 0
},
{
"_id": "5dd5183345409447308379e0",
"createdAt": "2019-11-20T10:40:21.040Z",
"name": "a2",
"__v": 0
},
...
...
{
"_id": "5dd5185545409447308379e8",
"createdAt": "2019-11-20T10:40:21.040Z",
"name": "a10",
"__v": 0
}
],
"count": 21
}如果没有匹配的文档,结果将是:
{
"items": [],
"count": 0
}https://stackoverflow.com/questions/58951098
复制相似问题