Node.js 在同一父文档中联接MongoDB子文档
鉴于此Node.js 在同一父文档中联接MongoDB子文档,node.js,mongodb,mongodb-query,aggregation-framework,Node.js,Mongodb,Mongodb Query,Aggregation Framework,鉴于此订单集合: //订单文档 [ { _id:“订单123”, 项目:[ {{u id:“item_123”,类型:“T恤”}, {{u id:“item_234”,类型:“Hoodie”}, {{u id:“item_345”,键入:“Hat”}, ], 退款:[ { _id:“退款”, 项目:[“项目123”、“项目234”], }, { _id:“退款234”, 项目:[“项目345”], }, ], }, ] 是否可以映射退款项目->项目。_id,允许我们按类型进行筛选 这是我们当前
订单
集合:
//订单文档
[
{
_id:“订单123”,
项目:[
{{u id:“item_123”,类型:“T恤”},
{{u id:“item_234”,类型:“Hoodie”},
{{u id:“item_345”,键入:“Hat”},
],
退款:[
{
_id:“退款”,
项目:[“项目123”、“项目234”],
},
{
_id:“退款234”,
项目:[“项目345”],
},
],
},
]
是否可以映射退款项目
->项目。_id
,允许我们按类型进行筛选
这是我们当前获取退款子文档的方式:
db.orders.aggregate([
{
$replaceRoot: {
newRoot: {
order: "$$ROOT",
refunds: "$$ROOT.refunds",
},
},
},
{
$unwind: "$refunds",
},
{
$project: {
order: "$order",
refund: "$refunds",
},
},
]);
这给了我们:
// Refund documents
[
{
refund: {
_id: "refund_123",
items: ["item_123", "item_234"],
},
order: { ... }, // The original order document
},
{
refund: {
_id: "refund_234",
items: ["item_345"],
},
order: { ... }, // The original order document
},
]
从这里,我们要映射退款.items
->订单.items.\u id
以生成以下输出:
[
{
_id:“退款”,
项目:[
{{u id:“item_123”,类型:“T恤”},
{{u id:“item_234”,类型:“Hoodie”},
],
},
{
_id:“退款234”,
项目:[
{{u id:“item_345”,键入:“Hat”}
],
},
]
允许我们按类型筛选退款文档
您可以使用$unwind
和$filter
进行此操作
$unwind
解构数组退款
$project
在\u id
中显示退款id,并使用$filter
筛选退款中的项目
请显示所需的结果。
db.orders.aggregate([
{ $unwind: "$refunds" },
{
$project: {
_id: "$refunds._id",
items: {
$filter: {
input: "$items",
cond: { $in: ["$$this._id", "$refunds.items"] }
}
}
}
}
])