Grouping sequelize data in separate objects - node.js

i am new with nodejs express with posgresql , i made a route like this :
get: async (req, res, next) => {
var cat = await sequelize.query(
`
SELECT
o."id" as "cart_id",
o."user_id",
o."createdBy",
o."createdAt",
o."updatedAt",
i."quantity",
pi."name",
pi."price"
FROM "Orders" AS o
Left join public."CartItem" i on i."cart_id"=o."id"
Left join public."Item" pi on pi."id"=i."product_id"
WHERE o."user_id"=${req.body.user_id}
`
,
{ type: QueryTypes.SELECT,group:`i."cart_id"` })
.catch(e => res.send(e))
if (cat) {
// console.log(cat.Orders)
cat.map(e=> {
console.log(e)
})
res.send(cat)
}
},
if i hit this route with postman i get this response :
[
{
"cart_id": 9,
"user_id": 1,
"createdBy": null,
"createdAt": "2022-11-11T09:51:47.968Z",
"updatedAt": "2022-11-11T09:51:47.968Z",
"quantity": 4,
"name": "test1",
"price": 12000
},
{
"cart_id": 9,
"user_id": 1,
"createdBy": null,
"createdAt": "2022-11-11T09:51:47.968Z",
"updatedAt": "2022-11-11T09:51:47.968Z",
"quantity": 4,
"name": "test2",
"price": 12000
}
]
My question is, is it possible to assemble the response in the following way:
[
"cart_9":[
{
"user_id": 1,
"createdBy": null,
"createdAt": "2022-11-11T09:51:47.968Z",
"updatedAt": "2022-11-11T09:51:47.968Z",
"quantity": 4,
"name": "test1",
"price": 12000
},
{
"user_id": 1,
"createdBy": null,
"createdAt": "2022-11-11T09:51:47.968Z",
"updatedAt": "2022-11-11T09:51:47.968Z",
"quantity": 4,
"name": "test2",
"price": 12000
}
]
]
note that the response assembled by the "cart_id" .
any suggestion to assemble the response and get the required response ?

Related

Making nested object 3 level in node js with sequelize from same table

right now i making a referral api like this in node js.
"id": 2,
"referralId": null,
"createdAt": "2022-05-13 15:15:16",
"updatedAt": "2022-05-13 15:15:16",
"child": [
{
"id": 1,
"referralId": 2,
"createdAt": "2022-05-13 12:41:00",
"updatedAt": "2022-05-13 12:41:00"
}
]
}
but i want it to have one more child. How is it possible.
{
"id": 2,
"referralId": null,
"createdAt": "2022-05-13 15:15:16",
"updatedAt": "2022-05-13 15:15:16",
"child": [
{
"id": 1,
"referralId": 2,
"createdAt": "2022-05-13 12:41:00",
"updatedAt": "2022-05-13 12:41:00",
"child": [
{
"id": 1,
"referralId": 2,
"createdAt": "2022-05-13 12:41:00",
"updatedAt": "2022-05-13 12:41:00"
}
]
}
]
}
also child is could be many.
right now this is the source. i am using sequelize btw. also child also come from same table as parent.
const getDownline = ((req, res) => {
model.referral.findOne({
where: {
id: req.body.id
}
}).then(data => {
model.referral.findAll({
where: {
referralId: req.body.id
}
}).then(child => {
data.setDataValue('child', child)
res.send(data)
}).catch(err => {
res.status(500).send(err)
})
})
})

How to add orders array in product

Whenever a customer checks out its saves an order that has products ordered by a customer and the product id, quantity and customers details like delivery address and customer phone number.
I want the same details to be added to all products in that order also so that the seller can also see that his product has been ordered
This i can achieve using each product's id in the orders since every product has its ID . But i dont know how to map the order's products id's and find the products in the products schema then add to them an array called orders.
This is how my orders schema looks like after an order has been placed
{
"allOrders": [
{
"_id": "6249ee9baa59aceb7d88f91d",
"placedby": "624471321dff6794a802431c",
"fullname": "Collins Jimu",
"deliveryaddress": "cnr fourth and herbet chitepo",
"phonenumber": "0773468496",
"whatsappphonenumber": "0773468496",
"ordersList": [
{
"name": "Hp 200 G4Core I5",
"qty": 1,
"price": 560,
"imgUrl": "https://res.cloudinary.com/kwingy/image/upload/v1648734312/cwynmzauqqnylrwsgejy.jpg",
"id": "6245b0c09390975e16263136"
},
{
"name": "bed",
"qty": 1,
"price": 160,
"imgUrl": "https://res.cloudinary.com/kwingy/image/upload/v1648732217/dtrb8saj0ellgyrcjpyy.jpg",
"id": "6245a88cf22df558d8d69162"
},
{
"name": "Sunglass",
"qty": 1,
"price": 6,
"imgUrl": "https://res.cloudinary.com/kwingy/image/upload/v1648738341/rtpiptqc1le6kywmuisf.jpg",
"id": "6245c03bf22df558d8d6a739"
},
{
"name": "sofas",
"qty": 1,
"price": 890,
"imgUrl": "https://res.cloudinary.com/kwingy/image/upload/v1648732837/xae655b5e9wovodfkvqn.jpg",
"id": "6245aacdf22df558d8d6939f"
}
],
"paymentmethod": "cashondeliver",
"orderstatus": "placed",
"createdAt": "2022-04-03T18:59:39.681Z",
"updatedAt": "2022-04-03T18:59:39.681Z",
"__v": 0
},
{
"_id": "6249fdc602cefac4faa36dde",
"placedby": "624471321dff6794a802431c",
"fullname": "My MUM",
"deliveryaddress": "123 HARARE STREET",
"phonenumber": "0773550804",
"whatsappphonenumber": "0773550804",
"ordersList": [
{
"name": "out door benches",
"qty": 1,
"price": 25,
"imgUrl": "https://res.cloudinary.com/kwingy/image/upload/v1648736078/in8rumwcm6rrebrmgb1q.jpg",
"id": "6245b792be41db13f9220867"
},
{
"name": "hammer",
"qty": 1,
"price": 10,
"imgUrl": "https://res.cloudinary.com/kwingy/image/upload/v1648735570/joceetdkx4penomtab8s.jpg",
"id": "6245b5849390975e16263647"
},
{
"name": "Watches",
"qty": 1,
"price": 4,
"imgUrl": "https://res.cloudinary.com/kwingy/image/upload/v1648735962/r4jmwlj7ltgc0njdtfdc.jpg",
"id": "6245b71abe41db13f92207ac"
},
{
"name": "iPhone X",
"qty": 1,
"price": 350,
"imgUrl": "https://res.cloudinary.com/kwingy/image/upload/v1648729600/ekcb86lmtkr0uniirb2i.jpg",
"id": "62459fc3be41db13f921f27a"
},
{
"name": "REFRIDGERATOR",
"qty": 1,
"price": 370,
"imgUrl": "https://res.cloudinary.com/kwingy/image/upload/v1648731962/fjrlvfnotdbonqnt9pjn.jpg",
"id": "6245a750be41db13f921f796"
}
],
"paymentmethod": "cashondeliver",
"orderstatus": "placed",
"createdAt": "2022-04-03T20:04:22.349Z",
"updatedAt": "2022-04-03T20:04:22.349Z",
"__v": 0
},
{
"_id": "624a12ea02cefac4faa431fd",
"placedby": "624471321dff6794a802431c",
"fullname": "Munyaradzi Makosa",
"deliveryaddress": "cnr fourth and herbet",
"phonenumber": "0777727363663",
"whatsappphonenumber": "0777727363663",
"ordersList": [
{
"name": "Wheels",
"qty": 1,
"price": 35,
"imgUrl": "https://res.cloudinary.com/kwingy/image/upload/v1648741496/xs9zpht0rhxpijrzyqrz.jpg",
"id": "6245cc859390975e162657ce"
},
{
"name": "MacBook Pro 2021",
"qty": 1,
"price": 1250,
"imgUrl": "https://res.cloudinary.com/kwingy/image/upload/v1648731661/h0dcvvhwntdy06mzgpah.webp",
"id": "6245a6649390975e16262737"
},
{
"name": "electric kettle",
"qty": 1,
"price": 22,
"imgUrl": "https://res.cloudinary.com/kwingy/image/upload/v1648734446/tyrdlrayn3opm7gagwmi.jpg",
"id": "6245b1239390975e162631e3"
}
],
"paymentmethod": "cashondeliver",
"orderstatus": "placed",
"createdAt": "2022-04-03T21:34:34.721Z",
"updatedAt": "2022-04-03T21:34:34.721Z",
"__v": 0
},
{
"_id": "624aa7cd02cefac4faa4750c",
"placedby": "624aa7a102cefac4faa474f3",
"fullname": "Ryan Katayi",
"deliveryaddress": "4164 Gwabalanda",
"phonenumber": "0718518438",
"whatsappphonenumber": "0718518438",
"ordersList": [
{
"name": "Budi 2017",
"qty": 1,
"price": 250,
"imgUrl": "/assets/images/products/Automotive/2.Audi2017.png",
"id": "6270512109915791"
}
],
"paymentmethod": "cashondeliver",
"orderstatus": "placed",
"createdAt": "2022-04-04T08:09:49.618Z",
"updatedAt": "2022-04-04T08:09:49.618Z",
"__v": 0
},
{
"_id": "624c0e770d2cf94693988609",
"placedby": "624aa7a102cefac4faa474f3",
"fullname": "Ryan Katayi",
"deliveryaddress": "4164 Gwabalanda",
"phonenumber": "0718518438",
"whatsappphonenumber": "0778687452",
"ordersList": [
{
"name": "Nike Airforce",
"qty": 2,
"price": 40,
"imgUrl": "https://res.cloudinary.com/kwingy/image/upload/v1649082553/hoodaley8bzrwa8xi2tr.jpg",
"id": "624b01250d2cf94693982652"
},
{
"name": "iPhone X",
"qty": 1,
"price": 350,
"imgUrl": "https://res.cloudinary.com/kwingy/image/upload/v1648729600/ekcb86lmtkr0uniirb2i.jpg",
"id": "62459fc3be41db13f921f27a"
}
],
"paymentmethod": "cashondeliver",
"orderstatus": "placed",
"createdAt": "2022-04-05T09:40:07.719Z",
"updatedAt": "2022-04-05T09:40:07.719Z",
"__v": 0
}
]
}
i have managed to get the ids of all the orders. But my challenge is i am stuck with only the products ids not sure how to use them and find each products and then patch them with an orders details array
const sellerProductsOrdered = asyncHandler (async (req, res) => {
const Orders = await Order.find();
const ordersList = Orders.map(order => {
return order
})
const ordersListProductsIds = ordersList.map(product => {
return product.id
})
console.log(ordersListProductsIds);
})

Retrieve object information within an array with mongoose

I'm making an API Rest with node, express, typescript and mongoose. I have a method GET that return this result:
{
"success": true,
"status": 200,
"message": "categories listed",
"data": [
{
"_id": "612650e55fe1ce0de138e2af",
"products": [
{
"_id": "612650e55fe1ce0de138e2b0",
"productID": {
"reviews": [
"611e61ba8cb43f7454787ebb",
"611e62008cb43f7454787ebc"
],
"_id": "610b18f3e2244a187b36f2d7",
"title": "PS4",
"description": "La mejor consola del mercado del mundo, mundial",
"photo": "https://amazon-clone-jparrot.s3.amazonaws.com/1628123519052",
"price": 400,
"stockQuantity": 23,
"__v": 0,
"category": "60fc6454b68717acc239cc6a",
"owner": "610b9ed8763da4308223aae0",
"averageRating": null,
"id": "610b18f3e2244a187b36f2d7"
},
"quantity": 1,
"price": 400
}
],
"owner": {
"_id": "611d2d39dfcc705972c1ccb8",
"name": "Jaume",
"email": "jaumeparrot2#gmail.com",
"password": "$2a$10$Rv9Rzrff6578feCdDjyeKuarKCSHYRqKp5n5wTi2IWtcLBOupvPgu",
"__v": 0,
"address": "611e9ccdf47c7a7a9cb1d5d9"
},
"estimatedDelivery": "Wednesday September 1st",
"__v": 0
}
]
}
The problem is that I need to retrieve the object "owner", that is, I need to recover this json:
{
"success": true,
"status": 200,
"message": "categories listed",
"data": [
{
"_id": "612650e55fe1ce0de138e2af",
"products": [
{
"_id": "612650e55fe1ce0de138e2b0",
"productID": {
"reviews": [
"611e61ba8cb43f7454787ebb",
"611e62008cb43f7454787ebc"
],
"_id": "610b18f3e2244a187b36f2d7",
"title": "PS4",
"description": "La mejor consola del mercado del mundo, mundial",
"photo": "https://amazon-clone-jparrot.s3.amazonaws.com/1628123519052",
"price": 400,
"stockQuantity": 23,
"__v": 0,
"category": "60fc6454b68717acc239cc6a",
"owner": {
"_id": "611d2d39dfcc705972c1ccb8",
"name": "Jaume",
"about": "My na is Jaume",
"__v": 0
},
"averageRating": null,
"id": "610b18f3e2244a187b36f2d7"
},
"quantity": 1,
"price": 400
}
],
"owner": {
"_id": "611d2d39dfcc705972c1ccb8",
"name": "Jaume",
"email": "jaumeparrot2#gmail.com",
"password": "$2a$10$Rv9Rzrff6578feCdDjyeKuarKCSHYRqKp5n5wTi2IWtcLBOupvPgu",
"__v": 0,
"address": "611e9ccdf47c7a7a9cb1d5d9"
},
"estimatedDelivery": "Wednesday September 1st",
"__v": 0
}
]
}
For generate this JSON, I'm using this method:
https://github.com/jparrot92/amazon-clone-back/blob/master/src/controllers/order.ts
To retrieve you should use data.owner. This will give owner details as object.
This is the solution:
const products = await Order.find({ owner: req.user._id })
.populate('owner')
.populate({
path: 'products.productID',
populate: {
path: 'owner',
model: 'Owner',
},
})
.exec();

Edit (Update) Specific value in MongoDB Document

I Want to update Only the value of payStatus
data : {
"profile": {
"guestName": "Hussein Khalil",
"mobile": "01223550119",
"email": "husseinkhalil33#gmail.com"
},
"hotelRoomingList": {
"child": {
"childAges": [
2,
4
],
"childNo": 2
},
"hotelStatus": "Not Confirmed",
"roomsNo": 3,
"adultsNo": 2,
"travelAgent": "Nilsen",
"hotelConfNo": "G1B412",
"roomingNotes": "Some rooming Notes",
"roomingList": {
"_id": "604b79ecb102efdea80a0698",
"roomingName": "Pyramids",
"roomingDescription": "this is Pyramids travels",
"revenueMonth": "jul",
"startedDate": "2021-03-12T14:25:48.830Z",
"__v": 0,
"id": "604b79ecb102efdea80a0698"
},
"hotel": {
"_id": "604d511964927d1759884e36",
"hotelName": "Concorde Front",
"__v": 0,
"id": "604d511964927d1759884e36"
},
"roomType": {
"_id": "604d516564927d1759884e37",
"roomType": "double",
"__v": 0,
"id": "604d516564927d1759884e37"
},
"mealPlane": {
"_id": "604aa5a7246f847df848c796",
"mealPlane": "SAL",
"__v": 0,
"id": "604aa5a7246f847df848c796"
},
"nights": 8,
"arrivalDate": "2021-03-27T22:00:00.000Z",
"departureDate": "2021-04-04T22:00:00.000Z"
},
"customerAccount": {
"payStatus": "not-gura-not-sure",
"fullPay": 3000,
"hotelCost": 2050,
"transportCost": 150,
"otherCost": 50,
"paid": 1250,
"optionDate": "2021-04-05T22:00:00.000Z",
"customerNotes": "some customerNotes",
"restOfPay": 1750,
"profit": 750
},
"transportation": {
"transport": {
"_id": "604b61b6aad5fab0f3c0d40d",
"transportType": "Bus",
"__v": 0,
"id": "604b61b6aad5fab0f3c0d40d"
},
"tripDate": "2021-03-27T22:00:00.000Z",
"noOfSets": 7,
"transportNotes": "some transportNotes"
},
"bookingStatus": "active",
"_id": "605dc47ed2ed656bce892182",
"salesPerson": "noor smay",
"marketSegment": {
"_id": "604b60796d049aafef1d3b0a",
"marketSegment": "Faceboook",
"__v": 0,
"id": "604b60796d049aafef1d3b0a"
},
"enteredBy": {
"role": "admin",
"_id": "604d1b9767fa82ccffc29acc",
"isAdmin": false,
"name": "ahmed magdy",
"email": "ahmedmagdy#test.com",
"password": "$2a$10$eoYyVF1TTTPQ7pWcCDLVQuvalw8g82yvzzmgD7fvQDH8mCZ4QE30S",
"createdAt": "2021-03-13T20:07:51.428Z",
"updatedAt": "2021-03-13T20:07:51.428Z",
"__v": 0
},
"resDate": "2021-03-26T11:24:46.644Z",
"__v": 0,
"id": "605dc47ed2ed656bce892182"
}
https://docs.mongodb.com/manual/tutorial/update-documents/
updateOne to update 1 record
updateMany for multiple records
await db.collection('inventory').updateOne({ }, // query
{
$set: { 'customerAccount.payStatus': 'New Value' } // update value
}
);
Demo - https://mongoplayground.net/p/iO4I4zVRnOP
Mongo query
db.collection.update({},{
$set: {
"customerAccount.payStatus": "New Value"
}
})

Mongoose, update of child will affect all parents?

What is the query to update below data with mongoose. So 3 fields are going to be updated. Top Parent Points, Categories Points and Tag Points.
{
"_id": "561fba5e7fac41a4055fad45",
"fullName": "Test",
"points": 45,
"level": 1,
"categories": [
{
"name": "Computer Science",
"points": 15,
"level": 1,
"_id": "561fba5e7fac41a4055fad46",
"tags": [
{
"name": "C#",
"points": 10,
"level": 1,
"_id": "561fba5e7fac41a4055fad47"
},
{
"name": "Java",
"points": 5,
"level": 1,
"_id": "561fba5e7fac41a4055ert12"
}
]
},
{
"name": "History",
"points": 30,
"level": 2,
"_id": "562407d4e3edf2113f61ac37",
"tags": [
{
"name": "WW2",
"points": 30,
"level": 2,
"_id": "56240797e3edf2113f61ac36"
}
]
}
]
}
to this one. When user gets a point from a specific tag, it will effect all parents. Let's say, user gets 10 points from C# then i have to update mongodb to this.
{
"_id": "561fba5e7fac41a4055fad45",
"fullName": "Test",
**"points": 55,**
"level": 1,
"categories": [
{
"name": "Computer Science",
**"points": 25,**
"level": 1,
"_id": "561fba5e7fac41a4055fad46",
"tags": [
{
"name": "c#",
**"points": 20,**
"level": 1,
"_id": "561fba5e7fac41a4055fad47"
},
{
"name": "Java",
"points": 5,
"level": 1,
"_id": "561fba5e7fac41a4055ert12"
}
]
},
{
"name": "History",
"points": 30,
"level": 2,
"_id": "562407d4e3edf2113f61ac37",
"tags": [
{
"name": "WW2",
"points": 30,
"level": 2,
"_id": "56240797e3edf2113f61ac36"
}
]
}
]
}
you should use $elemMatch for querying your object
db.tests.update({_id: yourTestId, categories: {$elemMatch: {_id: categoryId}}}, {$set: {$inc: {"categories.$.points": 10, points: 10}}})
So you querying only needed array element and update it values with $ reference

Resources