Сделайте сумму логических значений в виде целых чисел с MongoDB - PullRequest
0 голосов
/ 14 июня 2019

Я пытаюсь суммировать логические значения (где true означает 1 и false -1) в массиве для каждого документа в моей коллекции, а затем сортировать его.

Я использую конвейер агрегации MongoDB с $addFields, $sum и $cond.

Вот детская площадка: https://play.db -ai.co / m / XQLKqbkkgAABTFVm

Трубопровод:

[
  {
    "$addFields": {
      "score": {
        "$sum": {
              "$cond": [
                "$votes.value",
                1,
                -1
              ]
            }
      }
    }
  },
  {
    "$sort": {
      "score": -1
    }
  }
]

Коллекция:

[
  {
    "votes": [
      {
        "value": true
      },
      {
        "value": true

      },
      {
        "value": true

      },
      {
        "value": false

      }
    ]
  },
  {
    "votes": [
      {
        "value": true

      },
      {
        "value": true

      },
      {
        "value": false

      },
      {
        "value": false

      }
    ]
  }
]

Фактические результаты:

[
  {
    "_id": ObjectId("000000000000000000000000"),
    "votes": [
      {
        "value": true
      },
      {
        "value": true
      },
      {
        "value": true
      },
      {
        "value": false
      }
    ],
    "score": 1
  },
  {
    "_id": ObjectId("000000000000000000000001"),
    "votes": [
      {
        "value": true
      },
      {
        "value": true
      },
      {
        "value": false
      },
      {
        "value": false
      }
    ],
    "score": 1
  }
]

Что я хочу:

[{
    "_id": ObjectId("000000000000000000000000"),
    "votes": [
      {
        "value": true
      },
      {
        "value": true
      },
      {
        "value": true
      },
      {
        "value": false
      }
    ],
    "score": 2
}, {
 "_id": ObjectId("000000000000000000000001"),
    "votes": [
      {
        "value": true
      },
      {
        "value": true
      },
      {
        "value": false
      },
      {
        "value": false
      }
    ],
    "score": 0
}]

Ответы [ 2 ]

2 голосов
/ 14 июня 2019

Я заставил его работать, раскрутив массив, а затем снова сгруппировав по _id.

См. Детская площадка: https://play.db -ai.co / m / XQMFlZAtYAABLHtL

[
  {
    "$unwind": {
      "path": "$votes"
    }
  },
  {
    "$group": {
      "_id": "$_id",
      "votes": {
        "$push": "$votes"
      },
      "score": { 
        "$sum": {
          "$cond": [
            "$votes.value",
            1,
            -1
          ]
        } 
      }
    }
  },
  {
    "$sort": {
      "score": -1
    }
  }
]
0 голосов
/ 24 июня 2019

Для решения моей проблемы я использовал $map несколько раз. Решение @Plancke работает, но у меня были проблемы с использованием $match впоследствии (это всегда не давало результатов).

[
    {
      $addFields: {
        scoresInBoolean: {
          $map: {
            input: '$votes',
            as: 'vote',
            in: '$$vote.value',
          },
        },
      },
    }, {
      $addFields: {
        scoresInInteger: {
          $map: {
            input: '$scoresInBoolean',
            as: 'scoreInBoolean',
            in: {
              $cond: [
                '$$scoreInBoolean',
                1,
                -1,
              ],
            },
          },
        },
      },
    }, {
      $addFields: {
        score: {
          $sum: '$scoresInInteger',
        },
      },
    }
]
...