是否可以通过MongoDB查询返回特定的嵌套字段?

时间:2019-02-13 13:59:15

标签: arrays mongodb nested embedded-documents

是否可以获取每个运动类别的付款金额? 不仅限于“约翰”,而且在所有催缴文件中也是如此。

所提供数据的预期查询返回

{
  {"Fight":   [100,95] },
  {"Running": [50]     }
}

数据示例:

{"_id":"5z621578b0ce483b9866fb1f",
 "Name":"John",
 "Sports":[
           {"Category":"Fight",
            "Billing":[
                       {"Month":"Jan",
                        "Status":"Paid",
                        "Price":100},
                      {"Month":"Feb",
                       "Status":"Not Paid",
                       "Price":125}, 
                      {"Month":"Mar",
                       "Status":"Paid",
                       "Price":95}      
                      ]
           },

          {"Category":"Running",
           "Billing":[
                      {"Month":"Jan",
                       "Status":"Not Paid",
                       "Price":200}, 
                      {"Month":"Feb",
                       "Status":"Paid",
                       "Price":50}  
                     ]
          }
      ]
}

换句话说:我需要比较每个嵌套对象内的计费状态,并检查其是否为“付费” ,然后如果为true,则分别添加计费对象价格添加到相应运动类别的数组中。

对于集合中的所有文档,具有多个运动类别和多个计费月份。但总是相同的嵌套结构。

提前谢谢!

1 个答案:

答案 0 :(得分:0)

正如willis在其评论中所说,您将要使用连词:https://docs.mongodb.com/manual/aggregation/


以下汇总将为您提供所需的数据(用帐单的实际名称替换帐单):

db.billings.aggregate([
    { $unwind: '$Sports'},
    { $unwind: '$Sports.Billing'},
    { $match: { 'Sports.Billing.Status': 'Paid' } },
    {
        $group: {
            _id: '$Sports.Category',
            Category: {$first: '$Sports.Category'},
            Prices: { $push: '$Sports.Billing.Price' }
        }
    },
    { $project: {_id: 0} }
]);

此聚合的结果如下所示:

[
    {
        "Category" : "Running",
        "Prices" : [ 
            50.0
        ]
    },
    {
        "Category" : "Fight",
        "Prices" : [ 
            100.0, 
            95.0
        ]
    }
]

您在问题中要求的确切格式有点不正确;我认为,最好将其保持在产出之上的汇总形式。但是,如果您希望以类似问题形式的形式使用它,则聚合会稍微复杂一些:

db.billings.aggregate([
    { $unwind: '$Sports'},
    { $unwind: '$Sports.Billing'},
    { $match: { 'Sports.Billing.Status': 'Paid' } },
    {
        $group: {
            _id: '$Sports.Category',
            Prices: { $push: '$Sports.Billing.Price' }
        }
    },
    {
        $group: {
            _id: 0,
            Sports: { $push: { Category: '$_id', Prices: '$Prices' } }
        }
    },
    {
        $project: {
            Sports: {
                $arrayToObject: {
                    '$map': {
                        'input': '$Sports',
                        'as': 'el',
                        'in': {
                            'k': '$$el.Category',
                            'v': '$$el.Prices'
                        }
                    }
                }
            }
        }
    },
    { $replaceRoot: { newRoot: '$Sports'} }
]);
相关问题