Merge pull request #56 from Danakcorp/mrtz

populate : shipmentItem and product
This commit is contained in:
morteza-mortezai
2025-11-06 18:48:34 +03:30
committed by GitHub
+93 -58
View File
@@ -19,40 +19,17 @@ export class CancelOrderRepo extends BaseRepository<ICancelOrder> {
const skip = (page - 1) * limit; const skip = (page - 1) * limit;
const docs = await this.model.aggregate([ const docs = await this.model.aggregate([
{ // orders
$lookup: { { $lookup: { from: "orders", localField: "order", foreignField: "_id", as: "order" } },
from: "orders", { $unwind: { path: "$order", preserveNullAndEmptyArrays: true } },
localField: "order",
foreignField: "_id", // seller and user lookups
as: "order", { $lookup: { from: "sellers", localField: "canceller", foreignField: "_id", as: "seller" } },
}, { $addFields: { seller: { $ifNull: ["$seller", []] } } },
},
{ { $lookup: { from: "users", localField: "canceller", foreignField: "_id", as: "user" } },
$lookup: { { $addFields: { user: { $ifNull: ["$user", []] } } },
from: "sellers",
localField: "canceller",
foreignField: "_id",
as: "seller",
},
},
{
$addFields: {
seller: { $ifNull: ["$seller", []] },
},
},
{
$lookup: {
from: "users",
localField: "canceller",
foreignField: "_id",
as: "user",
},
},
{
$addFields: {
user: { $ifNull: ["$user", []] },
},
},
{ {
$addFields: { $addFields: {
cancellerDetails: { cancellerDetails: {
@@ -64,9 +41,9 @@ export class CancelOrderRepo extends BaseRepository<ICancelOrder> {
}, },
}, },
}, },
{ { $unset: ["user", "seller"] },
$unset: ["user", "seller"],
}, // cancelOrderItems (keep docs even if empty)
{ {
$lookup: { $lookup: {
from: "cancelorderitems", from: "cancelorderitems",
@@ -75,9 +52,9 @@ export class CancelOrderRepo extends BaseRepository<ICancelOrder> {
as: "cancelOrderItems", as: "cancelOrderItems",
}, },
}, },
{ { $unwind: { path: "$cancelOrderItems", preserveNullAndEmptyArrays: true } },
$unwind: "$cancelOrderItems",
}, // orderItem
{ {
$lookup: { $lookup: {
from: "orderitems", from: "orderitems",
@@ -86,17 +63,81 @@ export class CancelOrderRepo extends BaseRepository<ICancelOrder> {
as: "cancelOrderItems.orderItem", as: "cancelOrderItems.orderItem",
}, },
}, },
{ { $unwind: { path: "$cancelOrderItems.orderItem", preserveNullAndEmptyArrays: true } },
$unwind: "$cancelOrderItems.orderItem",
}, // products (shipmentItems.product) — keep nulls
{ {
$lookup: { $lookup: {
from: "products", from: "products",
localField: "cancelOrderItems.orderItem.shipmentItems.product", localField: "cancelOrderItems.orderItem.shipmentItems.product",
foreignField: "_id", foreignField: "_id",
as: "cancelOrderItems.orderItem.shipmentItems.product", as: "productDocs",
}, },
}, },
{
$addFields: {
"cancelOrderItems.orderItem.shipmentItems": {
$map: {
input: "$cancelOrderItems.orderItem.shipmentItems",
as: "si",
in: {
$mergeObjects: [
"$$si",
{
product: {
$arrayElemAt: [
{
$filter: {
input: "$productDocs",
as: "p",
cond: {
$eq: ["$$p._id", "$$si.product"],
},
},
},
0,
],
},
},
],
},
},
},
},
},
{ $unset: "productDocs" },
// cancel reason -> lookup into temp field, then inject into nested path
{
$lookup: {
from: "cancelreasons",
localField: "cancelOrderItems.reason",
foreignField: "_id",
as: "reasonDoc",
},
},
{ $unwind: { path: "$reasonDoc", preserveNullAndEmptyArrays: true } },
{
$addFields: {
"cancelOrderItems.reason": "$reasonDoc",
},
},
{ $unset: ["reasonDoc"] },
{
$addFields: {
"cancelOrderItems.shipmentItem": {
$first: {
$filter: {
input: "$cancelOrderItems.orderItem.shipmentItems",
as: "si",
cond: { $eq: ["$$si._id", "$cancelOrderItems.shipmentItem"] },
},
},
},
},
},
{ {
$lookup: { $lookup: {
from: "shops", from: "shops",
@@ -105,28 +146,22 @@ export class CancelOrderRepo extends BaseRepository<ICancelOrder> {
as: "cancelOrderItems.orderItem.shipmentItems.product.shop", as: "cancelOrderItems.orderItem.shipmentItems.product.shop",
}, },
}, },
{ { $unwind: { path: "$cancelOrderItems.orderItem.shipmentItems.product.shop", preserveNullAndEmptyArrays: true } },
$unwind: "$cancelOrderItems.orderItem.shipmentItems.product.shop",
}, // sort BEFORE facet / pagination
{ $sort: { createdAt: -1 } },
// facet for pagination + count
{ {
$facet: { $facet: {
data: [{ $skip: skip }, { $limit: limit }], data: [{ $skip: skip }, { $limit: limit }],
totalCount: [{ $count: "count" }], totalCount: [{ $count: "count" }],
}, },
}, },
{
$addFields: { { $addFields: { totalCount: { $arrayElemAt: ["$totalCount.count", 0] } } },
totalCount: { $arrayElemAt: ["$totalCount.count", 0] },
},
},
{
$sort: {
createdAt: -1,
},
},
]); ]);
console.dir(docs[0], { depth: null });
return { return {
count: (docs[0]?.totalCount as number) || 0, count: (docs[0]?.totalCount as number) || 0,
docs: docs[0]?.data || [], docs: docs[0]?.data || [],