MongoDB$组不允许我创建$项目额外字段
我几乎让这一个工作,但我根本不明白为什么$project部分不适用于普通字段 这是发票表: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
{
"_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: