MongoDB$组不允许我创建$项目额外字段

MongoDB$组不允许我创建$项目额外字段,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我几乎让这一个工作,但我根本不明白为什么$project部分不适用于普通字段 这是发票表: { "_id" : "AS6D0", "invoiceNumber" : 23, "bookingId" : "AS6D0", "createDate" : 1490369414, "dueDate" : 1490369414, "invoiceLines" : [ { "lineText" : "Rent Pric

我几乎让这一个工作,但我根本不明白为什么$project部分不适用于普通字段

这是发票表:

{
    "_id" : "AS6D0",
    "invoiceNumber" : 23,
    "bookingId" : "AS6D0",
    "createDate" : 1490369414,
    "dueDate" : 1490369414,
    "invoiceLines" : [ 
        {
            "lineText" : "Rent Price",
            "amountPcs" : "8 x 7500",
            "amountTotal" : 60000
        }, 
        {
            "lineText" : "Discount(TIKO10)",
            "amountPcs" : "10%",
            "amountTotal" : -10000
        }, 
        {
            "lineText" : "Final cleaning",
            "amountPcs" : "1 x 5000",
            "amountTotal" : 5000
        }, 
        {
            "lineText" : "Reservation fee paid already",
            "amountPcs" : "1 x -20000",
            "amountTotal" : -20000
        }
    ],
    "managerId" : "4M4KE"
}
这是我的问题

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
        }
    }

]) 

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

您可以使用如下技巧:

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

多亏了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
        }
    }

])  

当然,当您分组时,您无法访问不属于该组的任何字段。你希望它们能带来什么回报?这是一个分组。@MateoBarahona您是对的-但在本例中,我将记录中的一个数组分组。dueDate和invoiceNumber不是该数组的一部分。如果我将一组记录分组,我可以理解,但在本例中,它只是一个数组。有什么想法吗?正如我所说的,我认为当您聚合时,您不能期望得到$group子句中未定义的任何内容。@MateoBarahona hmmm。。。它不允许我在id字段之外分组,这很奇怪。想知道是否有可能对聚合中的同一个表进行$lookup并让该表获取字段?@MateoBarahona好的,我现在明白你的意思了,因为$unwind只是将内部数组转换为X个记录。有没有办法将invoiceLines数组移动到聚合中的另一个数组中?@Veeram-太好了!!我先不知道美元的事。非常感谢Veeram: