是否有可能让facet以对象而不是数组的形式返回?如果需要访问result[0].total
而不仅仅是result.total
,这似乎有点违反直觉
代码(使用mongoose):
Model
.aggregate()
.match({
"name": { "$regex": name },
"user_id": ObjectId(req.session.user.id),
"_id": { "$nin": except }
})
.facet({
"results": [
{ "$skip": start },
{ "$limit": finish },
{
"$project": {
"map_levels": 0,
"template": 0
}
}
],
"total": [
{ "$count": "total" },
]
})
.exec()
发布于 2018-08-07 05:01:30
使用$facet
得到的每个字段代表单独的聚合管道,这就是为什么总是得到一个数组的原因。您可以使用$addFields用单个元素覆盖已有的total
。要获得第一个项目,您可以使用$arrayElemAt
Model
.aggregate()
.match({
"name": { "$regex": name },
"user_id": ObjectId(req.session.user.id),
"_id": { "$nin": except }
})
.facet({
"results": [
{ "$skip": start },
{ "$limit": finish },
{
"$project": {
"map_levels": 0,
"template": 0
}
}
],
"total": [
{ "$count": "total" },
]
})
.addFields({
"total": {
$arrayElemAt: [ "$total", 0 ]
}
})
.exec()
发布于 2018-08-07 06:20:33
你也可以试试这个
Model
.aggregate()
.match({
"name": { "$regex": name },
"user_id": ObjectId(req.session.user.id),
"_id": { "$nin": except }
})
.facet({
"results": [
{ "$skip": start },
{ "$limit": finish },
{
"$project": {
"map_levels": 0,
"template": 0
}
}
],
"total": [
{ "$count": "total" },
]
})
.addFields({
"total": {
"$ifNull": [{ "$arrayElemAt": [ "$total.total", 0 ] }, 0]
}
})
.exec()
发布于 2021-04-08 13:10:38
假设您想要将$facet的结果传递到下一阶段,假设是$match。$match接受文档数组作为输入,并返回与表达式匹配的文档数组,如果$facet的输出只是一个元素,我们就不能将其输出传递给$match,因为$facet的输出类型与$match的输入类型不同($match只是一个例子)。在我看来,最好将$facet的输出保存为数组,以避免处理这些类型的情况。
附言:我所说的并不是官方的
https://stackoverflow.com/questions/51718370
复制相似问题