Mongodb 使用两组不同的条件通过聚合管道从数据库中匹配和获取数据

Mongodb 使用两组不同的条件通过聚合管道从数据库中匹配和获取数据,mongodb,mongoose,mongodb-query,aggregation-framework,Mongodb,Mongoose,Mongodb Query,Aggregation Framework,我在$match阶段传递了一组条件,但出于某种原因,我希望使用另一组条件获取数据。这些条件必须与“或”连用 i.e: $match(condition set1) || $match(condition set2) 条件集1: $match: { status: 'running', hero: { $in: ['superman', 'batman', 'ironman'] }, playReport: null, } 或 条件集2: Matc

我在
$match
阶段传递了一组条件,但出于某种原因,我希望使用另一组条件获取数据。这些条件必须与“或”连用

i.e: $match(condition set1) || $match(condition set2)
条件集1:

$match: {
      status: 'running',
      hero: { $in: ['superman', 'batman', 'ironman'] },
      playReport: null,
    }

条件集2:

 Match condition, where `lastPlayed` time should be greater than the `playReport.timestamp`
样本数据:

{
    status: 'running',
    hero: 'superman',
    playReport: null
},
{
    status: 'stopped',
    hero: 'batman',
    playReport: null
},
{
    status: 'stopped',
    hero: 'spiderman',
    playReport: null
},
{
    status: 'running',
    hero: 'ironman',
    playReport: {
        timestamp: '2020-10-21T10:05:03.940+00:00'
    }
    lastPlayed: '2021-10-21T10:05:03.940+00:00'
},
{
    status: 'running',
    hero: 'batwoman',
    playReport: null
},
{
    status: 'stopped',
    hero: 'thor',
    playReport: null
}
输出:

{
    status: 'running',
    hero: 'superman',
    playReport: null
},
{
    status: 'running',
    hero: 'ironman',
    playReport: {
        timestamp: '2020-10-21T10:05:03.940+00:00'
    }
    lastPlayed: '2021-10-21T10:05:03.940+00:00'
},
  • 使用
    $或
    运算符指定这两个条件
  • 要匹配内部字段,请使用带有
    $gt
    运算符的
    $expr
    表达式条件

Hi@turivishal,mongoose.find()方法中是否也有同样的方法。因此,我在.aggregate之后做了一个.populate,似乎两者都不兼容。是的,您可以使用
find()
方法查看
db.collection.aggregate([
  {
    $match: {
      $or: [
        {
          status: "running",
          hero: {
            $in: ["superman", "batman", "ironman"]
          },
          playReport: null
        },
        {
          $expr: {
            $gt: [
              "$lastPlayed",
              "$playReport.timestamp"
            ]
          }
        }
      ]
    }
  }
])