node.js - Mongoose 聚合得到 2 个变量
问题描述
我无法使用聚合来获取 2 个变量。在我的集合中,我想通过 createdAt 过滤掉某些文档,并将每个匹配的文档推送到数组变量中。
之后,我还想要第二个变量,它显示匹配的文档数量。
我设法在他们自己的聚合中将它们分开,但不知何故我不能将它们组合在一起以在 1 个聚合中工作
对象数组的一个:
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 }
]);
所以我想在 data 变量中是这样的:
{
items: [ {...}, {...}, ...],
count: 24
}
解决方案
如果您的 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
}
推荐阅读
- ios - WKWebView 的“loadHTMLString”高度宽度问题
- function - SASS @function 在@mixin 中插入属性
- r - 使用 stringr str_extract R 提取复杂名称:处理“DE”、“VAN”
- repository - 如何过滤和删除自 2 年以来未更新的工件存储库
- c# - 如何仅从剃刀视图中的 List ViewModel 的 foreach 循环中获取第一项
- java - 如何使用 lambdas 正确制作多级地图?
- javascript - 选中某个复选框时,选中其他复选框
- android - 从产品构建中排除特定子模块
- excel - Excel 共享工作簿,自动/使用 vba 解决冲突或忽略
- java - 未为创建的新配置单元表创建分区文件