mongodb - $ sum возвращает 0 - PullRequest
       6

mongodb - $ sum возвращает 0

0 голосов
/ 11 февраля 2019

Целью этого запроса является то, когда вы «Получивший сотрудник возвращает общее количество продаж».

Мой первый запрос был

db.Employee.aggregate([{$lookup: {from: "Invoice", localField: "_id", foreignField: "_id", as: "Invoices"}}, {$match: {_id: 2}}]).pretty()

, который возвратил приведенный ниже фрагмент, хотя он возвращает только одного клиента, даже если у сотрудника есть несколько клиентов.Я не совсем уверен, почему он возвращает только один.

{
"_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()

Я не понимаю, почему этот запрос не возвращает итоговое значение.Все, что я пробовал, провалилось.Любая помощь приветствуется.

Редактировать:

Моя база данных имеет следующую структуру: Сотрудник> Клиент> Счет.Отзывы клиентов Employee через SupportRepId, который совпадает с идентификатором сотрудника, поскольку каждому клиенту назначается сотрудник, а в счете-фактуре содержится идентификатор клиента, так как в каждом счете-фактуре есть клиент.Поэтому я хочу получить все счета и итоговую сумму на основе идентификатора сотрудника.

Пример сотрудника:

{
    "_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
        }
    ]
}

1 Ответ

0 голосов
/ 12 февраля 2019

Посмотрите, работает ли это

db.Employee.aggregate([
  {
    $match: {
      "Employee._id": 2
    }
  },
  {
    $lookup: {
      from: "Customer",
      localField: "_id",
      foreignField: "customer.SupportRepId",
      as: "customer"
    }
  },
  {
    $lookup: {
      from: "Invoice",
      localField: "customer._id",
      foreignField: "invoice.CustomerId",
      as: "invoice"
    }
  }
])
...