Mongoose/MongoDB:在Child数组中将三个字段加在一起

Mongoose/MongoDB: Add Three Fields Together in Child Array

我目前正在尝试创建一个临时字段,将三个字段加在一起,然后根据用户输入的值进行查询(他们只看到计算结果并需要它匹配)

我最大的问题是让投影按我的需要工作。我的字段布局如下所示:

{
  _id: ObjectId(),
  userId: "",
  orderNumber: "",
  items: [
           {
             _id: ObjectId(),
             rateInfo: {
                         baseRate: 100,
                         tolls: 50,
                         fees: 25,
                       },
           },
           {
             _id: ObjectId(),
             rateInfo: {
                         baseRate: 200,
                         tolls: 25,
                         fees: 10,
                       },
           },
           {
             _id: ObjectId(),
             rateInfo: {
                         baseRate: 25,
                         tolls: 5,
                         fees: 0,
                       },
           },
         ],
}

我需要能够在 rateInfo 中添加所有三个字段,并将它们显示在每个项目数组中,如下所示:

{
  _id: ObjectId(),
  userId: "",
  orderNumber: "",
  items: [
           {
             _id: ObjectId(),
             rateInfo: {
                         baseRate: 100,
                         tolls: 50,
                         fees: 25,
                       },
             rateTotal: 175,
           },
           {
             _id: ObjectId(),
             rateInfo: {
                         baseRate: 200,
                         tolls: 25,
                         fees: 10,
                       },
             rateTotal: 235,
           },
           {
             _id: ObjectId(),
             rateInfo: {
                         baseRate: 25,
                         tolls: 5,
                         fees: 0,
                       },
             rateTotal: 30,
           },
         ],
}

我尝试了以下代码片段,但似乎都不适合我:

$reduce 方法对 items 数组中的所有内容求和,然后将总数放在订单级别,如下所示:

{
  rateTotal: 440
  document: {
    _id: ObjectId(),
    userId: "",
    orderNumber: "",
    items: [
             {
               _id: ObjectId(),
               rateInfo: {
                           baseRate: 100,
                           tolls: 50,
                           fees: 25,
                         },
             },
             {
               _id: ObjectId(),
               rateInfo: {
                           baseRate: 200,
                           tolls: 25,
                           fees: 10,
                         },
             },
             {
               _id: ObjectId(),
               rateInfo: {
                           baseRate: 25,
                           tolls: 5,
                           fees: 0,
                         },
             },
           ],
  }
}

$unwind 方法仅将第一条记录相加,如下所示:

{
  rateTotal: 175
  document: {
    _id: ObjectId(),
    userId: "",
    orderNumber: "",
    items: [
             {
               _id: ObjectId(),
               rateInfo: {
                           baseRate: 100,
                           tolls: 50,
                           fees: 25,
                         },
             },
             {
               _id: ObjectId(),
               rateInfo: {
                           baseRate: 200,
                           tolls: 25,
                           fees: 10,
                         },
             },
             {
               _id: ObjectId(),
               rateInfo: {
                           baseRate: 25,
                           tolls: 5,
                           fees: 0,
                         },
             },
           ],
  }
}

如果有人能清楚地说明我做错了什么以及如何改正,将不胜感激。

注意:猫鼬虚拟是不可能的,因为我需要查询它。我无法回填 mongoose 模式中的计算字段(使用自定义 setter 或预保存)。

您可以使用 $map 映射到您想要的结构。

db.collection.aggregate([
  {
    "$addFields": {
      "items": {
        "$map": {
          "input": "$items",
          "as": "i",
          "in": {
            _id: "$$i._id",
            rateInfo: {
              baseRate: "$$i.rateInfo.baseRate",
              tolls: "$$i.rateInfo.tolls",
              fees: "$$i.rateInfo.fees"
            },
            rateTotal: {
              "$add": [
                "$$i.rateInfo.baseRate",
                "$$i.rateInfo.tolls",
                "$$i.rateInfo.fees"
              ]
            }
          }
        }
      }
    }
  }
])

这里是Mongo playground供您参考。

对于您的试验,您已经找到了 $reduce 试验的原因。 对于您的 $unwind 试验,结果实际上是正确的。只是数组被数组“压扁”了。您实际上应该能够看到多个文档,因为它们对应于每个数组条目。由于您只是查看第一个文档,所以您正在查看第一个数组元素的结果。