$ multiply, предоставляя ноль, когда в поле $ project - PullRequest
0 голосов
/ 26 октября 2019

Я новичок в mongodb, и у меня возникли проблемы с моим $ mutiply, он выдает нулевое значение, когда я пытаюсь умножить число сотрудников на случайную цифру, которую я составил, равную 100 000, на среднюю заработную плату, котораяЯ только что пометил «Заработная плата».

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

db.HomeWork.aggregate([
{
    $match:{
      category_code:"music_video",
      number_of_staff:{$gte:100}}},
{
        $group:{
          _id: "$business_name"
      }
},
{
  $project:{
    _id:1,
    number_of_staff:1,
    Wages:{
      $multiply:["$number_of_staff",100000]
    }
  }
}
]).pretty()

Все остальное, кроме «Заработной платы», в порядке, но Заработная плата дает ноль, любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 26 октября 2019

Пока вы новичок в MongoDB, правильно понимайте стадию агрегирования mongoDB ... и это то же самое, что вы пытаетесь делать со своими данными. Поскольку у меня нет ваших данных, я подал вам один пример. и дает вам понимание этапов агрегирования.

рассмотрите данные такого типа.

{
    "_id" : ObjectId("5db368e9d130deb5c19f35c8"),
    "role" : "cus",
    "created" : 1
 }
 {
    "_id" : ObjectId("5db36913d130deb5c19f35c9"),
    "role" : "cus",
    "created" : 1
 }
 {
    "_id" : ObjectId("5db36926d130deb5c19f35ca"),
    "role" : "support",
    "created" : 5
 }
 {
    "_id" : ObjectId("5db36929d130deb5c19f35cb"),
    "role" : "support",
    "created" : 5
 }
 {
    "_id" : ObjectId("5db37bcfd130deb5c19f35cc"),
    "role" : "support",
    "created" : 5
 }

, а затем Первый этап - $ match вaggregate.

db.counts.aggregate([ { $match: { created: {$gte:1} } } ])

на этом этапе все данные созданного> = 1 передаются на следующий этап, который является этапом $ group. и результат $ match stage равен.

{ "_id" : ObjectId("5db368e9d130deb5c19f35c8"), "role" : "cus", "created" : 1 }
{ "_id" : ObjectId("5db36913d130deb5c19f35c9"), "role" : "cus", "created" : 1 }
{ "_id" : ObjectId("5db36926d130deb5c19f35ca"), "role" : "support", "created" : 5 }
{ "_id" : ObjectId("5db36929d130deb5c19f35cb"), "role" : "support", "created" : 5 }
{ "_id" : ObjectId("5db37bcfd130deb5c19f35cc"), "role" : "support", "created" : 5 }

, а затем второй этап $ group получает эти данные. и этап ...

db.counts.aggregate([{ $match: { created: { $gte:1 }} },{ $group: { _id: "$role", count: {$sum:1} } }])

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

{ "_id" : "support", "count" : 3 }
{ "_id" : "cus", "count" : 2 }

Итак, следующий этап $ project получает только результаты выше группового этапаи $ этап проекта равен

db.counts.aggregate([{ $match: { created: { $gte:1 }} },{ $group: { _id: "$role", count: {$sum:1} } },{ $project:{ Multi : { $multiply: [ "$count", 100000 ] }} }])

, а последний этап дает результаты ...

{ "_id" : "support", "Multi" : 300000 }
{ "_id" : "cus", "Multi" : 200000 }

Теперь рассмотрим вашу проблему , вваш этап $ group вы возвращаете только тип поля _id на этап $ projection. и решение этой проблемы ...

db.counts.aggregate([{ $match: { created: { $gte:1 }} },{ $group: { _id:{Role: "$role",Created: "$created"} } },{ $project:{ Multi : { $multiply: [ "$_id.Created", 100000 ] }} }])     
...