MongoDB 聚合:连接集合并分配字段

问题描述 投票:0回答:1

我正在尝试连接 MongoDB 中的两个集合,并将一个集合中的字段分配给另一个集合。然而,我在获得预期结果方面遇到了困难。这是场景以及我到目前为止所尝试的:

场景: 我有两个收藏:门票和付款。每个票据文档都有一个 paymentId 字段,引用付款集合中的文档。我想加入这两个集合,并将付款中的定价选项 ID 和数量字段分配给门票。

{
  "_id": ObjectId("ticket_id_1"),
  "paymentId": ObjectId("payment_id_1"),
  // Other fields
}
// More ticket documents...
{
  "_id": ObjectId("payment_id_1"),
  "pricingOptionId": "option_id_1",
  "quantity": 5,
  // Other fields
}
// More payment documents...

这是我尝试过的聚合管道:

db.tickets.aggregate([
  {
    $lookup: {
      from: "payments",
      localField: "paymentId",
      foreignField: "_id",
      as: "payment"
    }
  },
  {
    $unwind: {
      path: "$payment",
      preserveNullAndEmptyArrays: true
    }
  },
  {
    $addFields: {
      paymentFields: {
        $ifNull: ["$payment", {}]
      }
    }
  },
  {
    $set: {
      pricingOptionId: "$paymentFields.pricingOptionId",
      quantity: "$paymentFields.quantity"
    }
  },
  {
    $unset: "paymentFields"
  }
])
mongodb
1个回答
0
投票

要解决您在 MongoDB 聚合中加入集合和分配字段时遇到的问题,您可以按如下方式调整聚合管道:

db.tickets.aggregate([
  {
    $lookup: {
      from: "payments",
      localField: "paymentId",
      foreignField: "_id",
      as: "payment"
    }
  },
  {
    $unwind: {
      path: "$payment",
      preserveNullAndEmptyArrays: true
    }
  },
  {
    $addFields: {
      pricingOptionId: "$payment.pricingOptionId",
      quantity: "$payment.quantity"
    }
  },
  {
    $project: {
      payment: 0 // Exclude the payment field if not needed
    }
  }
])

在这个调整后的管道中:

  • $addFields
    阶段直接从
    pricingOptionId
    子文档中提取
    quantity
    payment
    字段,而不创建中间字段。
  • 如果最终输出中不需要,则可以使用
    $project
    阶段排除
    payment
    字段。

通过进行这些修改,您应该能够成功加入集合并将所需字段从一个集合分配到 MongoDB 聚合管道中的另一个集合。

© www.soinside.com 2019 - 2024. All rights reserved.