Mongodb Mongo聚合基于其他字段创建自定义字段

Mongodb Mongo聚合基于其他字段创建自定义字段,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我有这样的订单文档(这是一个伪集合,但我认为它应该足够说明): 和产品系列: { _id: ObjectID, status: String } 我正在使用聚合获取订单摘要 [{ $unwind: '$items' }, { $lookup: { from: 'products', localField: 'items.products', foreignField: '_id', as: 'product' } },

我有这样的订单文档(这是一个伪集合,但我认为它应该足够说明):

和产品系列:

{ 
  _id: ObjectID,
  status: String        
}
我正在使用聚合获取订单摘要

[{
  $unwind: '$items'
}, {
  $lookup: {
    from: 'products',
    localField: 'items.products',
    foreignField: '_id',
    as: 'product'
  }
}, 
 {$unwind:'$product'},
{
  $group: {
    _id: '$_id',
    status: {
      $first: '$status',
    },
    products: {
      $addToSet: '$product.status'
    }
  }
}]
现在它返回:

[ { _id: 57643e3a7d2dd411009e8869,
  status: 'processed',
  products: [ 'printing', 'done' ] } 
]
然而,我的订单状态实际上是由它自己的状态和它的子产品的状态组合而来的

因此,我希望status是一个表达式的结果,该表达式考虑了products数组,例如:

status = ~products.indexOf('printing') ? 'in print' : '$status'
我的设置比较复杂,但基本上我需要查看产品状态,然后有某种总体状态来表示它们的状态,如果没有某些条件,则默认为原始订单状态

也许对于另一个问题,我也面临一个挑战,即并非所有项目都有相关的产品(它们在办公室中手动分配),因此我还需要检查我的项目计数是否等于/不等于产品计数,并从那里影响状态。呸

我一直在看$add和$filter,但还没能完成整个设置。我现在正在手动执行此操作,但如果让Mongo执行此操作,我会很高兴

status = ~products.indexOf('printing') ? 'in print' : '$status'