首页 > 解决方案 > MongoDB在找不到结果时返回格式化对象

问题描述

我的MongoDB聚合管道中有以下阶段,它返回销售的数量和总和,效果很好:

{
  $lookup: {
    from: 'sales',
    let: { part: '$_id' },
    pipeline: [
        { $match: { $and: [{ $expr: { $eq: ['$partner', '$$part'] } }] } },
        { $group: { _id: null, qty: { $sum: 1 }, soldFor: { $sum: '$soldFor' } } },
        { $project: { _id: 0, qty: 1, soldFor: 1 } }],
    as: 'sales'}},
    { $unwind: { path: '$sales', preserveNullAndEmptyArrays: true } },
    { $project: { _id: 1, sales: 1 }
}

但是,如果没有销售,则$project投影返回一个空的销售对象,但我真正想要的是返回一个已完成的对象,但带有 0 - 像这样:

{
  sales: {
    qty: 0,
    soldFor: 0
  }
}

标签: mongodbpipelineaggregation

解决方案


您可以$cond在此处使用运算符

{
  "$project": {
    "_id": 1,
    "sales": {
      "$cond": [
        { "$eq": [{ "$size": "$sales" }, 0] },
        {
          "sales": {
            "qty": 0,
            "soldFor": 0
          }
        },
        "$sales"
      ]
    }
  }
}

推荐阅读