MongoDB 来自比赛的聚合链

MongoDB aggregate chain from matches

我的目标是排除已经从 MongoDb 中的先前匹配聚合匹配的记录。

在第一场比赛中,我需要从两个国家/地区获取记录:美国和德国。

在第二场比赛中,我需要排除给定国家/地区的记录,例如美国和 "Begginer" 级别,但保留来自美国和德国的其他记录。这怎么可能? 示例数据:

[
  {
    country: 'United States',
    personName: 'John',
    level: 'Average',
  },
  {
    country: 'United States',
    personName: 'Rina',
    level: 'Begginer',
  },
  {
    country: 'Germany',
    personName: 'John',
    level: 'Average',
  }
]

第一场比赛(正确):

{
  country: {$in: ['United States', 'Germany']}
}

第二场比赛(错误):

{
  $and: [
    { level: { $ne: 'Begginer'} },
    { country: { $eq: 'United States' } },
  ]
}

我不想在第二个匹配阶段再次添加国家/地区数组。

您需要 $or 以便保留所有非 'United States':

的记录
db.stuff.aggregate([
  { $match: {
      country: {$in: ['United States', 'Germany'] }
    }
  },
  { $match: {
      $or: [
        { country: { $ne: 'United States' } },
        { country: { $eq: 'United States' }, level: { $ne: 'Begginer'} }
      ]
    }
  }
]);

然后您可以将 2 场比赛合二为一。

db.stuff.aggregate([
  { $match: {
      country: {$in: ['United States', 'Germany'] },
      $or: [
        { country: { $ne: 'United States' } },
        { country: { $eq: 'United States' }, level: { $ne: 'Begginer'} }
      ]
    }
  }
]);

这两个查询都会输出:

{
        "_id" : ObjectId("5e999bdee125b211df7f361a"),
        "country" : "United States",
        "personName" : "John",
        "level" : "Average"
}
{
        "_id" : ObjectId("5e999bdee125b211df7f361c"),
        "country" : "Germany",
        "personName" : "John",
        "level" : "Average"
}

https://mongoplayground.net/p/oXBqAzBHzUr