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

Mongodb 如何构造在两个字段上聚合的mongo查询?,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,TL;博士如何以两种不同方式聚合集合的方式查询mongo? 我正在学习查询MongoDB。假设我有一个集合,其中包含用户提交问卷的结果,然后审核人签署他们已经审核了问卷 “我的收藏”中的记录如下所示: { _id: 0, Questions: [ { label: "fname", response: "Sir" }, { label: "lname

TL;博士如何以两种不同方式聚合集合的方式查询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
}

在3.4版本的单个项目阶段中,您可以重写查询以获得这两个结果

用于筛选问题

 [
  {"$match":{"Questions.Label":{"$in":["fname", "lname"]}},
  {"$project":{
    "Questions":{
      "$filter":{
        "input":"$Questions",
        "as":"q",
        "cond":{"$in":["$$q.Label",["fname","lname"]]}
      }
    },
    "SignatureCount":{"$size":"$Signatures"}
  }}
]

可能需要编辑:输入文档使用
标签
字段,聚合查询使用
标签
。我看到一个错误,显示
无效运算符“$in”代码:15999
。您需要3.4版本。shell上的db.version()来检查您的版本。如果您需要较低版本,我可以添加变通方法。您可以使用上面提到的变通方法。看起来shell和DB都是版本3.2.3。但我几天前刚下载并安装了它。为什么我应该得到一个旧版本?您是否尝试过
“cond”:{$setIsSubset:[[“$$q.Label”],[“fname”,“lname”]}