MongoDB $ group不允许$ $项目额外的字段

时间:2017-04-14 05:54:05

标签: mongodb mongodb-query aggregation-framework

我几乎让这个工作了,但我根本无法弄清楚为什么$ project部分不适用于普通字段....

这是"发票"表:

db.getCollection('invoice').aggregate([
    {
        $match: {
            bookingId: "AS6D0"
        }
    },

    {
        $unwind: "$invoiceLines"        
    },

    {
        $group: {
            _id: "$_id",
            sum: {$sum: "$invoiceLines.amountTotal"}
        }
    },

    {
        $project:{
            "_id" : 0,
            "invoiceNumber" : 1,
            "dueDate" : 1,
            "sum" : 1
        }
    }

]) 

这是我的查询

pg_proc

我得到_id和总和,但它不会显示invoiceNumber和dueDate

2 个答案:

答案 0 :(得分:1)

你可以使用这样的技巧:

db.getCollection('invoice').aggregate([ 
{ $match: { } },
{ $unwind: "$invoiceLines" },
{ $group: { _id: "$_id",
sum: {$sum: "$invoiceLines.amountTotal"}, 
invoiceNumber: { $addToSet: "$invoiceNumber" }, 
dueDate: { $addToSet: "$dueDate" } } } 
]); 

答案 1 :(得分:0)

感谢Mateo,这就是我最终的结果: (我在字段上展开以避免单值数组)

更新:您无需$addToSet将字段缩减为单值数组和$unwind。请改用$first

db.getCollection('invoice').aggregate([
    {
        $match: {
            bookingId: "AS6D0"
        }
    },

    {
        $unwind: "$invoiceLines"        
    },

    {
        $group: {
            _id: "$_id",
            sum: {$sum: "$invoiceLines.amountTotal"},
            invoiceNumber: { $first: "$invoiceNumber" }, 
            dueDate: { $first: "$dueDate" }         
        }
    },
    {
        $project:{
            "_id" : 0,
            "invoiceNumber" : 1,
            "dueDate" : 1,
            "sum" : 1
        }
    }

])