首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >mongodb从facet返回对象

mongodb从facet返回对象
EN

Stack Overflow用户
提问于 2018-08-07 11:22:14
回答 3查看 2.4K关注 0票数 7

是否有可能让facet以对象而不是数组的形式返回?如果需要访问result[0].total而不仅仅是result.total,这似乎有点违反直觉

代码(使用mongoose):

代码语言:javascript
运行
复制
        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() 
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-08-07 13:01:30

使用$facet得到的每个字段代表单独的聚合管道,这就是为什么总是得到一个数组的原因。您可以使用$addFields用单个元素覆盖已有的total。要获得第一个项目,您可以使用$arrayElemAt

代码语言:javascript
运行
复制
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()
票数 5
EN

Stack Overflow用户

发布于 2018-08-07 14:20:33

你也可以试试这个

代码语言:javascript
运行
复制
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()
票数 3
EN

Stack Overflow用户

发布于 2021-04-08 21:10:38

假设您想要将$facet的结果传递到下一阶段,假设是$match。$match接受文档数组作为输入,并返回与表达式匹配的文档数组,如果$facet的输出只是一个元素,我们就不能将其输出传递给$match,因为$facet的输出类型与$match的输入类型不同($match只是一个例子)。在我看来,最好将$facet的输出保存为数组,以避免处理这些类型的情况。

附言:我所说的并不是官方的

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51718370

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档