Как объявить переменную из поля документа внутри редуктора или карты в агрегации? - PullRequest
0 голосов
/ 27 сентября 2019

У меня есть коллекция, подобная следующей:

{
  id: 1,
  names: {
    first: 'Ana',
    second: '',
    third: 'Smith',
    four: 'Smitchd'
  },
  used: [
    {
      position: 'first',
      id: 'A'
    },
    {
      position: 'second',
      id: 'B'
    },
  ] 
}

Мне нужно посчитать, сколько used names имеют коллекции через документы, за исключением того, что они пусты.

Позиция namesиспользуемые сохраняются в массиве с именем used.

В этом примере мне нужно сосчитать имена, которые существуют внутри used, но в names не пусто

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

db.collection.aggregate([
  { $match: id: 1 },
  { $project: { 
    totalUsed: $reduce: {
      input: '$used',
      initialValue: 0,
      in: { $add: ['$$value', { $cond: [{ $eq: ["$$name.$$this.position", '' ]}, 1, 0] }]}
    }
  }}
])

Мне нужно получить количество использованных пустых имен ... В примере я должен получитьcount: 1, потому что, даже когда используется existe first и secodn, поле names.second пусто.

1 Ответ

0 голосов
/ 28 сентября 2019

Я решил это ...

Я конвертирую объект names в массив объектов ({k: key, v: value}), затем я объявил переменную с names (newмассив) и used и использовать сокращение Insed of.

Я ищу индекс в новом массиве для ключа в $$used.position при уменьшении, а затем сравниваю, если значение равно "", и добавляю 1 или 0 в зависимости от случая

db.collection.aggregate([
  { $match: id: 1 },
  {
    $project: {
      id: "$id",
      used: { "$used" },
      names: {  $objectToArray : "$names" },
    }
  },
  { 
    $project: {
     totalUsed: {
      $let: {
        vars: { names: "$names", used: "$used" },
        in: {
          $reduce: {
            input: "$$used",
            initialValue: 0,
            in: {
              $add: [
                "$$value",
                  {
                    $cond: [
                      { $eq: [{ $arrayElemAt: ["$$names.v", { $indexOfArray: ["$$names.k", "$$this.position"] } ]}, ""]},
                      0,
                      1
                    ]

                  }
              ]
            }
          }
        }
      }
     }
    }
  },
  {
    $group: { _id: "$id", used: { $sum:"$totalUsed" } }
  }
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...