是否可以将facet作为对象而不是数组返回?需要访问result[0].total
而不是result.total
代码(使用猫鼬):
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()
答案 0 :(得分:3)
您使用$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()
答案 1 :(得分:2)
您也可以尝试
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()
答案 2 :(得分:0)
假设您想将 $facet 的结果传递给下一阶段,假设为 $match。 $match 接受一个文档数组作为输入并返回一个匹配表达式的文档数组,如果 $facet 的输出只是一个元素,我们不能将其输出传递给 $match,因为 $facet 的输出类型是与 $match 的输入类型不同($match 只是一个例子)。在我看来,最好将 $facet 的输出保留为数组以避免处理这些类型的情况。
PS:我说的没有正式的