MongoDB:对数组中的对象中的值==“ Some String”求和的次数

时间:2019-07-04 21:16:56

标签: mongodb mongoose aggregation-framework

我有一个看起来像这样的MongoDB文档:

{
  "_id": 000000000001,
  "sample": [
    {
      "_id": {
        "$oid": "12345678910"
      },
      "Phone": 5555555555,
      "LastName": "Musk",
      "FirstName": "Elon",
      "responses": {
        "question1": "hello",
        "question2": "world"
      }
    },
    {
      "_id": {
        "$oid": "12345678911"
      },
      "Phone": "1111111111",
      "LastName": "Jobs",
      "FirstName": "Steve",
      "responses": {
        "question1": "goodbye",
        "question2": "world"
      }
    }
  ]
}

我想让$sumhello做出回复question1的所有人中,以及所有对{{ 1}}。

例如。我想要一个看起来像这样的回复:

world

我的查询看起来像这样,但是没有用。当我知道不是这种情况时,只会返回给定金额的question2

{ 'question1': 1, 'question2': 2 }

有人可以帮我吗?

1 个答案:

答案 0 :(得分:0)

您需要使用$unwind的数据来获取每个响应的单个文档,并使用$facet来运行两个单独的过滤条件。然后,您需要$size来获取剩余数据集的长度,请尝试:

db.col.aggregate([
    { $unwind: "$sample" },
    { $project: { responses: { $objectToArray: "$sample.responses" } } },
    { $unwind: "$responses" },
    {
        $facet: {
            hello: [ { $match: { $expr: { $and: [ { $eq: [ "$responses.k", "question1" ] }, { $eq: [ "$responses.v", "hello" ] } ] } } } ],
            world: [ { $match: { $expr: { $and: [ { $eq: [ "$responses.k", "question2" ] }, { $eq: [ "$responses.v", "world" ] } ] } } } ],
        }
    },
    {
        $project: {
            question1: { $size: "$hello" },
            question2: { $size: "$world" },
        }
    }
])