Merge pull request #56 from Danakcorp/mrtz
populate : shipmentItem and product
This commit is contained in:
@@ -19,40 +19,17 @@ export class CancelOrderRepo extends BaseRepository<ICancelOrder> {
|
||||
const skip = (page - 1) * limit;
|
||||
|
||||
const docs = await this.model.aggregate([
|
||||
{
|
||||
$lookup: {
|
||||
from: "orders",
|
||||
localField: "order",
|
||||
foreignField: "_id",
|
||||
as: "order",
|
||||
},
|
||||
},
|
||||
{
|
||||
$lookup: {
|
||||
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", []] },
|
||||
},
|
||||
},
|
||||
// orders
|
||||
{ $lookup: { from: "orders", localField: "order", foreignField: "_id", as: "order" } },
|
||||
{ $unwind: { path: "$order", preserveNullAndEmptyArrays: true } },
|
||||
|
||||
// seller and user lookups
|
||||
{ $lookup: { 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: {
|
||||
cancellerDetails: {
|
||||
@@ -64,9 +41,9 @@ export class CancelOrderRepo extends BaseRepository<ICancelOrder> {
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
$unset: ["user", "seller"],
|
||||
},
|
||||
{ $unset: ["user", "seller"] },
|
||||
|
||||
// cancelOrderItems (keep docs even if empty)
|
||||
{
|
||||
$lookup: {
|
||||
from: "cancelorderitems",
|
||||
@@ -75,9 +52,9 @@ export class CancelOrderRepo extends BaseRepository<ICancelOrder> {
|
||||
as: "cancelOrderItems",
|
||||
},
|
||||
},
|
||||
{
|
||||
$unwind: "$cancelOrderItems",
|
||||
},
|
||||
{ $unwind: { path: "$cancelOrderItems", preserveNullAndEmptyArrays: true } },
|
||||
|
||||
// orderItem
|
||||
{
|
||||
$lookup: {
|
||||
from: "orderitems",
|
||||
@@ -86,17 +63,81 @@ export class CancelOrderRepo extends BaseRepository<ICancelOrder> {
|
||||
as: "cancelOrderItems.orderItem",
|
||||
},
|
||||
},
|
||||
{
|
||||
$unwind: "$cancelOrderItems.orderItem",
|
||||
},
|
||||
{ $unwind: { path: "$cancelOrderItems.orderItem", preserveNullAndEmptyArrays: true } },
|
||||
|
||||
// products (shipmentItems.product) — keep nulls
|
||||
{
|
||||
$lookup: {
|
||||
from: "products",
|
||||
localField: "cancelOrderItems.orderItem.shipmentItems.product",
|
||||
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: {
|
||||
from: "shops",
|
||||
@@ -105,28 +146,22 @@ export class CancelOrderRepo extends BaseRepository<ICancelOrder> {
|
||||
as: "cancelOrderItems.orderItem.shipmentItems.product.shop",
|
||||
},
|
||||
},
|
||||
{
|
||||
$unwind: "$cancelOrderItems.orderItem.shipmentItems.product.shop",
|
||||
},
|
||||
{ $unwind: { path: "$cancelOrderItems.orderItem.shipmentItems.product.shop", preserveNullAndEmptyArrays: true } },
|
||||
|
||||
// sort BEFORE facet / pagination
|
||||
{ $sort: { createdAt: -1 } },
|
||||
|
||||
// facet for pagination + count
|
||||
{
|
||||
$facet: {
|
||||
data: [{ $skip: skip }, { $limit: limit }],
|
||||
totalCount: [{ $count: "count" }],
|
||||
},
|
||||
},
|
||||
{
|
||||
$addFields: {
|
||||
totalCount: { $arrayElemAt: ["$totalCount.count", 0] },
|
||||
},
|
||||
},
|
||||
{
|
||||
$sort: {
|
||||
createdAt: -1,
|
||||
},
|
||||
},
|
||||
|
||||
{ $addFields: { totalCount: { $arrayElemAt: ["$totalCount.count", 0] } } },
|
||||
]);
|
||||
|
||||
console.dir(docs[0], { depth: null });
|
||||
return {
|
||||
count: (docs[0]?.totalCount as number) || 0,
|
||||
docs: docs[0]?.data || [],
|
||||
|
||||
Reference in New Issue
Block a user