MongoDB 提取文件

MongoDB Extract document

我有这个Json:

{
    "_id": {
        "$oid": "613a55dccXXXXXXX28b5ba3a1"
    },
    "user": "CHEWBACCA",
    "paymentTypes": [{
            "type": "PILOT",
            "limits": [{
                    "type": "FLIGHT_HOURS",
                    "amount": 10
                },
                {
                    "type": "COMBAT_HOURS",
                    "amount": 80000
                },
                {
                    "type": "TRAINING_HOURS",
                    "amount": 80000
                }
            ]
        },
        {
            "type": "WARRIOR",
            "limits": [{
                    "type": "FLIGHT_HOURS",
                    "amount": 22
                },
                {
                    "type": "COMBAT_HOURS",
                    "amount": 123
                },
                {
                    "type": "TRAINING_HOURS",
                    "amount": 456
                }
            ]
        }
    ],
    "createdDate": "2021-11-11"
}

我想对 paymentType.type 等于“PILOT”和限制等于类型等于“COMBAT_HOURS”进行独占过滤。

这是我希望收到的结果。

{
    "_id": {
        "$oid": "613a55dccXXXXXXX28b5ba3a1"
    },
    "user": "CHEWBACCA",
    "paymentTypes": [{
        "type": "PILOT",
        "limits": [{
            "type": "COMBAT_HOURS",
            "amount": 80000
        }]
    }],
    "createdDate": "2021-11-11"
}

如何提取文件达到这个结果?

查询

  • 地图paymentTypes
  • 如果paymentType= PILOT,过滤限制以仅保留战斗时间
  • else null(我们不想要那个 paymentType)
  • 删除空值(那些空值是不是 PILOT 类型的 paymentType)

*这可能导致空数组,无论是在 paymentTypes 上还是在 limits 上,如果您不接受空数组,您可以匹配并删除包含这些空数组的文档

PlayMongo

aggregate(
[{"$addFields": 
    {"paymentTypes": 
      {"$map": 
        {"input": "$paymentTypes",
          "in": 
          {"$cond": 
            [{"$eq": ["$$ptype.type", "PILOT"]},
              {"$mergeObjects": 
                ["$$ptype",
                  {"limits": 
                    {"$filter": 
                      {"input": "$$ptype.limits",
                        "cond": {"$eq": ["$$this.type", "COMBAT_HOURS"]}}}}]},
              null]},
          "as": "ptype"}}}},
  {"$addFields": 
    {"paymentTypes": 
      {"$filter": 
        {"input": "$paymentTypes", "cond": {"$ne": ["$$this", null]}}}}}])