我正在尝试连接 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 聚合中加入集合和分配字段时遇到的问题,您可以按如下方式调整聚合管道:
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 聚合管道中的另一个集合。