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 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 || [],
|
||||||
|
|||||||
Reference in New Issue
Block a user