在数组中聚合 mongodb 搜索

aggregate mongodb search in array

我的文档在 mongodb collection :

{ 
  'id' : 'ID1',
  'status' : 'ST1',
  'logs' : [
    {
      'id' : 'ID2',
      'status_old' : 'ST2',
      'status_new' : 'ST3',
    },
    {
      'id' : 'ID3',
      'status_old' : 'ST3',
      'status_new' : 'ST4',
    }
  ]
},
{ 
  'id' : 'ID4',
  'status' : 'ST4',
  'logs' : [
    {
      'id' : 'ID5',
      'status_old' : 'ST2',
      'status_new' : 'ST3',
    }
  ]
}

我想通过以下两个过滤器传递文档

filter1 : 
where
   ( status    = 'ST1'  OR
    status_old = 'ST1'  OR
    status_new = 'ST1'  )

那么得到的答案应该放在下面的过滤器(条件)中:

filter2 : 
where
   ( status    = 'ST2'  OR
    status_old = 'ST2'  OR
    status_new = 'ST2'  )

答案陈述有两个条件,根据上面提供的文件,情况如下:

{ 
  'id' : 'ID1',
  'status' : 'ST1',
  'logs' : [
    {
      'id' : 'ID2',
      'status_old' : 'ST2',
      'status_new' : 'ST3',
    },
    {
      'id' : 'ID3',
      'status_old' : 'ST3',
      'status_new' : 'ST4',
    }
  ]
},

因为您没有从 logs 数组中过滤掉任何元素,所以这看起来像是一个包含 2 $match 个阶段的聚合,其中包含 $or

db.collection.aggregate([
  {
    $match: {
      $or: [
        {
          "status": "ST1"
        },
        {
          "logs.status_old": "ST1"
        },
        {
          "logs.status_new": "ST1"
        }
      ]
    }
  },
  {
    $match: {
      $or: [
        {
          "status": "ST2"
        },
        {
          "logs.status_old": "ST2"
        },
        {
          "logs.status_new": "ST2"
        }
      ]
    }
  }
])

demo