mongodb从方面返回对象

时间:2018-08-07 03:22:14

标签: javascript mongodb mongoose

是否可以将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() 

3 个答案:

答案 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:我说的没有正式的