如何构建一个聚合在两个字段上的mongo查询?

时间:2018-03-15 19:22:49

标签: mongodb mongodb-query aggregation-framework

TL; DR;如何以两种不同方式聚合集合的方式查询mongo?

我正在学习查询MongoDB。假设我有一个集合,其中包含提交问卷的用户的结果,然后审核者签署他们已经审核过的。

我的收藏中的记录如下所示:

{
    _id: 0,
    Questions:
    [
        {
            label: "fname",
            response: "Sir"
        },  
        {
            label: "lname",
            response: "Robin"
        },
        {
            label: "What is your name?",
            response: "Sir Robin of Camelot"
        },
        {
            label: "What is your quest?",
            response: "To seek the holy grail"
        },
        {
            label: "What is the capital of Asyria?",
            response: "I don't know that."
        }
    ],
    Signatures:
    [
        "Lancelot",
        "Arthur"
    ]
}

我正在创建一个报告,显示每条记录的摘要。 对于每条记录,我需要显示以下内容:

  • 名字

  • 姓氏

  • 签名数量。

我能够编写一个获取名字和姓氏的聚合查询。 我还能够编写一个获取签名数量的聚合查询。

但是,当我尝试编写一个可以同时获取这两者的聚合查询时,我感到困惑。

// In order to query the first and last name, I use this query:
[
    { $unwind: "$Questions" },
    { $match: { "Questions.Label": { $in: ["fname", "lname"] } } },
    { $project: { "Questions": 1 } },
    { $group: { _id: "$_id", Questions: { $push: "$Questions" } } }
]

// In order to query the number of signatures, I use this query:
[
    { $project: { "SignatureCount": { $size: "$Signatures" } } }
]

所有内容都适用于这两个查询,但我想编写一个单独的查询,将所有数据一起返回。

因此,例如,如果上面的示例记录是我的集合中的唯一记录,我希望查询返回:

{
    _id: 0,
    Questions:
    [
        {
            label: "fname",
            response: "Sir"
        },  
        {
            label: "lname",
            response: "Robin"
        }
    ],
    SignatureCount: 2
}

1 个答案:

答案 0 :(得分:1)

您可以重写查询以在3.4版本的单个项目阶段获得。

使用$filter过滤问题。

o.getClass().getAnnotation(Entity.class) != null;