【发布时间】:2019-02-11 19:58:07
【问题描述】:
此查询的目的是当您“假设员工返回总销售额”时。
我的第一个问题是这样的
db.Employee.aggregate([{$lookup: {from: "Invoice", localField: "_id", foreignField: "_id", as: "Invoices"}}, {$match: {_id: 2}}]).pretty()
尽管员工有几个客户,但它只返回一个客户,但它返回了以下 sn-p。我不完全确定为什么它只返回一个。
{
"_id" : 2,
"LastName" : "Edwards",
"FirstName" : "Nancy",
"Title" : "Sales Manager",
"ReportsTo" : 1,
"BirthDate" : ISODate("1958-12-08T00:00:00Z"),
"HireDate" : ISODate("2002-05-01T00:00:00Z"),
"Address" : "825 8 Ave SW",
"City" : "Calgary",
"State" : "AB",
"Country" : "Canada",
"PostalCode" : "T2P 2T3",
"Phone" : "+1 (403) 262-3443",
"Fax" : "+1 (403) 262-3322",
"Email" : "nancy@chinookcorp.com",
"Invoices" : [
{
"_id" : 2,
"CustomerId" : 4,
"InvoiceDate" : ISODate("2009-01-02T00:00:00Z"),
"BillingAddress" : "Ullevålsveien 14",
"BillingCity" : "Oslo",
"BillingState" : null,
"BillingCountry" : "Norway",
"BillingPostalCode" : "0171",
"Total" : 3.96,
"InvoiceLines" : [
{
"_id" : 3,
"TrackId" : 6,
"UnitPrice" : 0.99,
"Quantity" : 1
},
{
"_id" : 4,
"TrackId" : 8,
"UnitPrice" : 0.99,
"Quantity" : 1
},
{
"_id" : 5,
"TrackId" : 10,
"UnitPrice" : 0.99,
"Quantity" : 1
},
{
"_id" : 6,
"TrackId" : 12,
"UnitPrice" : 0.99,
"Quantity" : 1
}
]
}
]
}
为了解决这个问题并实现返回总销售额的目标,我创建了这个新查询
db.Employee.aggregate([{$unwind: "$_id"}, {$lookup: {from: "Invoice", localField: "_id", foreignField: "_id", as: "Invoices"}}, {$match: {_id: 2}}, {$group: {_id: "$_id", Total: {$sum: "$Total"}}}]).pretty()
虽然它只是返回{ "_id" : 2, "Total" : 0 }
查看了其他问题后,我认为这可能是因为文档是嵌套的,尽管尝试了潜在的解决方案,但它没有产生任何输出。没有错误这是好的,但没有任何反应。这是我尝试过的查询:
db.Employee.aggregate([{$unwind: "$_id"}, {$unwind: "$_id.Invoices"}, {$unwind: "$_id.Invoices.InvoiceLines"}, {$lookup: {from: "Invoice", localField: "_id", foreignField: "_id", as: "Invoices"}}, {$match: {_id: 2}}, {$group: {_id: "$_id", Total: {$sum: "$Total"}}}]).pretty()
我不明白为什么这个查询没有返回总数。我尝试过的一切都失败了。任何帮助表示赞赏。
编辑:
我的数据库结构如下:员工>客户>发票。客户通过 SupportRepId 引用员工,这与员工 ID 相同,因为每个客户都被分配了一个员工,并且 Invoice 包含客户 ID,因为每个发票都有一个客户。所以我想获取所有发票并根据员工 ID 合计。
员工示例:
{
"_id":3,
"LastName":"Peacock",
"FirstName":"Jane",
"Title":"Sales Support Agent",
"ReportsTo":2,
"BirthDate": ISODate("1973-08-29T00:00:00 Z"),
"HireDate": ISODate("2002-04-01T00:00:00 Z"),
"Address":"1111 6 Ave SW",
"City":"Calgary",
"State":"AB",
"Country":"Canada",
"PostalCode":"T2P 5M5",
"Phone":"+1 (403) 262-3443",
"Fax":"+1 (403) 262-6712",
"Email":"jane@chinookcorp.com"
}
客户示例:
{
"_id":1,
"FirstName":"Luís",
"LastName":"Gonçalves",
"Company":"Embraer - Empresa Brasileira de Aeronáutica S.A.",
"Address":"Av. Brigadeiro Faria Lima, 2170",
"City":"São José dos Campos",
"State":"SP",
"Country":"Brazil",
"PostalCode":"12227-000",
"Phone":"+55 (12) 3923-5555",
"Fax":"+55 (12) 3923-5566",
"Email":"luisg@embraer.com.br",
"SupportRepId":3
}
发票示例:
{
"_id":2,
"CustomerId":4,
"InvoiceDate": ISODate("2009-01-02T00:00:00 Z"),
"BillingAddress":"Ullevålsveien 14",
"BillingCity":"Oslo",
"BillingState":null,
"BillingCountry":"Norway",
"BillingPostalCode":"0171",
"Total":3.96,
"InvoiceLines":[
{
"_id":3,
"TrackId":6,
"UnitPrice":0.99,
"Quantity":1
},
{
"_id":4,
"TrackId":8,
"UnitPrice":0.99,
"Quantity":1
},
{
"_id":5,
"TrackId":10,
"UnitPrice":0.99,
"Quantity":1
},
{
"_id":6,
"TrackId":12,
"UnitPrice":0.99,
"Quantity":1
}
]
}
【问题讨论】:
-
是因为
{$match: {_id: 2}}只匹配了_id为2的文档 -
嗨,匹配 id 用于将 id 为 2 的员工与该员工服务的所有客户匹配,但我的输出只显示一个,而不是应该有 5 个。
-
啊,我看到我将员工中的 id 2 与具有 id 2 的发票匹配,而不是所有具有员工 id 2 的发票。
-
正确。从发票文档中提供更多示例也将有助于澄清问题。您是否保存了有关这些发票属于哪个推销员的任何信息?正如您所说,您正在将发票 ID 与推销员 ID 匹配
-
我添加了员工、客户和发票数据的示例,并简要说明了员工如何通过客户连接到发票。全部经过编辑。
标签: mongodb mongodb-query aggregation-framework