MongoDB найти и сгруппировать похожие товары - PullRequest
1 голос
/ 22 марта 2020

У меня есть таблица для команд, которая выглядит, как показано ниже:

enter image description here

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

Italy    4    5
Mexico   4    5
England  3    5
Chile    3    5

Ответы также должны быть четкими.

Это то, что я имею до сих пор:

var team1 = db.Teams.find();
var team2 =db.Teams.find();
team1.forEach(function(item){team2.forEach(function(item2){if (item.goalsFor == item2.goalsFor && item.goalsAgainst == item2.goalsAgainst) {print(item2.team, item2.goalsFor, item2.goalsAgainst);}})})

Спасибо.

1 Ответ

1 голос
/ 22 марта 2020

Вы можете попробовать следующий запрос:

db.collection.aggregate([
  /** Group on 'goalsFor' & 'goalsAgainst' for similars & push teams to 'teams' array,
  *  Will be one or more (if there are any similar teams with same 'goalsFor' & 'goalsAgainst' then that doc will have 2 or more elements/teams in teams array) */
  {
    $group: {
      _id: { goalsFor: "$goalsFor", goalsAgainst: "$goalsAgainst" },
      teams: { $push: "$team" }
    }
  },
  /** Filter docs where there are multiple teams in 'teams' array */
  { $match: { $expr: { $gte: [{ $size: "$teams" }, 2] } } }
]);

Тест: MongoDB-Playground

Обновление до ответа:

Для MongoDB версии 2.6.10, попробуйте следующий запрос:

db.collection.aggregate([
  {
    $group: {
      _id: {
        goalsFor: "$goalsFor",
        goalsAgainst: "$goalsAgainst"
      },
      teams: {
        $push: "$team"
      }
    }
  },
  {
    $project: {
      teams: 1,
      _id: 0,
      goalsFor: "$_id.goalsFor",
      goalsAgainst: "$_id.goalsAgainst",
      teamsSize: {
        $size: "$teams"
      }
    }
  },
  {
    $match: {
      teamsSize: {
        $gte: 2
      }
    }
  },
  {
    $project: {
      teamsSize: 0
    }
  }
])

Тест: MongoDB-Playground

...