How to add an orders array under product schema - node.js

I have an orders schema which saves all orders when ever a customers checksout. It stores product ID.
This is how my orders schema looks like after saving an order.
{
"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
},
]
my challenge now is after an order has been placed i want products ordered to display the orders under products schema since these products under the Products schema are showing.
The moment an order with different products is placed each product ordered must receiver the order details of the person who orderd it and quantity.

Related

prioritize group in sequelize

I have a table named Products that is associated with another table named BaseProducts.
for getting the list of Products, I need to group the Products with BaseProductId.
but the problem is that I need to return only those products that has more quantity and the most cheapest. so I used Order. but it does not work.
const e = await Product.findAll({
order: [
["quantity", "DESC"],
["price", "ASC"],
["name", "ASC"]
],
group: "baseProductId",
limit: 100,
offset: 0,
});
here it's like it returns random items when using group. but I want to only include those Items that has first, more Quantity, second the most cheapest, and third sort alphabetically.
here is the sql generated by sequelize:
SELECT `id`, `name`, `nameEn`, `sku`, `barcode`, `quantity`, `price`, `finalPrice`, `sort`, `status`, `kianSync`, `createdAt`, `updatedAt`, `deletedAt`, `baseProductId` FROM `Products` AS `Product`
WHERE (`Product`.`deletedAt` IS NULL)
GROUP BY `baseProductId`
ORDER BY `Product`.`quantity` DESC, `Product`.`price` ASC, `Product`.`name` ASC
LIMIT 0, 100;
this is with group by:
[
{
"id": "3d2d181a-23f9-47b6-abee-ab61d1a86d02",
"name": "rrrrrrrr",
"nameEn": "nameEn",
"sku": "sku",
"barcode": "barcode",
"quantity": 1,
"price": 1000,
"finalPrice": 1000,
"sort": 1,
"status": "status",
"kianSync": 1,
"createdAt": "2023-01-02T06:53:26.000Z",
"updatedAt": "2023-01-02T06:53:26.000Z",
"deletedAt": null,
"baseProductId": null
}
]
this is without group by:
[
{
"id": "83939936-2c40-4921-9046-e40a1313bf77",
"name": "rrrrrrrr",
"nameEn": "nameEn",
"sku": "sku",
"barcode": "barcode",
"quantity": 2,
"price": 1000,
"finalPrice": 1000,
"sort": 2,
"status": "status",
"kianSync": 1,
"createdAt": "2023-01-02T06:53:26.000Z",
"updatedAt": "2023-01-02T06:53:26.000Z",
"deletedAt": null,
"baseProductId": null
},
{
"id": "8184b96c-1175-4de2-98c4-9faf231dabdc",
"name": "rrrrrrrr",
"nameEn": "nameEn",
"sku": "sku",
"barcode": "barcode",
"quantity": 2,
"price": 2000,
"finalPrice": 2000,
"sort": 3,
"status": "status",
"kianSync": 1,
"createdAt": "2023-01-02T06:53:26.000Z",
"updatedAt": "2023-01-02T06:53:26.000Z",
"deletedAt": null,
"baseProductId": null
},
{
"id": "3d2d181a-23f9-47b6-abee-ab61d1a86d02",
"name": "rrrrrrrr",
"nameEn": "nameEn",
"sku": "sku",
"barcode": "barcode",
"quantity": 1,
"price": 1000,
"finalPrice": 1000,
"sort": 1,
"status": "status",
"kianSync": 1,
"createdAt": "2023-01-02T06:53:26.000Z",
"updatedAt": "2023-01-02T06:53:26.000Z",
"deletedAt": null,
"baseProductId": null
}
]

Grouping sequelize data in separate objects

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 ?

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);
})

Flter mongodb database using mongoose nodejs

I need to filter some users according to some fixed criteria. I have a user collection and a talent collection. The talent collection holds the reference to a master category collection.
What I need is to filter these users according to the category in the talent collection and some keys from the user collection.
For example I need to search for a user whose gender is 'male' and education 'BTech' and will have talents as a programmer and tester
my user collection is like,
{
"_id": "5f1939239bd35429ac9cd78f",
"isOtpVerified": "false",
"role": "user",
"adminApproved": 1,
"status": 0,
"languages": "Malayalam, Tamil, Telugu, Kannada",
"name": "Test user",
"email": "test#email.com",
"phone": "1234567890",
"otp": "480623",
"uid": 100015,
"bio": "Short description from user",
"dob": "1951-09-07T00:00:00.000Z",
"gender": "Male",
"education": "Btech",
"bodyType": "",
"complexion": "",
"height": "",
"weight": "",
"requests": [],
"location": {
"place": "place",
"state": "state",
"country": "country"
},
"image": {
"avatar": "5f1939239bd35429ac9cd78f_avatar.jpeg",
"fullsize": "5f1939239bd35429ac9cd78f_fullsize.png",
"head_shot": "5f1939239bd35429ac9cd78f_head_shot.jpeg",
"left_profile": "5f1939239bd35429ac9cd78f_left_profile.png",
"right_profile": "5f1939239bd35429ac9cd78f_right_profile.png"
},
"__v": 42,
"createdAt": "2020-07-23T07:15:47.387Z",
"updatedAt": "2020-08-18T18:54:22.272Z",
}
Talent collection
[
{
"_id": "5f38efef179aca47a0089667",
"userId": "5f1939239bd35429ac9cd78f",
"level": "5",
"chars": {
"type": "Fresher",
},
"category": "5f19357b50bcf9158c6be572",
"media": [],
"createdAt": "2020-08-16T08:35:59.692Z",
"updatedAt": "2020-08-16T08:35:59.692Z",
"__v": 0
},
{
"_id": "5f3b7e6f7e322948ace30a2c",
"userId": "5f1939239bd35429ac9cd78f",
"level": "3",
"chars": {
"type": "Fresher",
},
"category": "5f19359250bcf9158c6be573",
"media": [
{
"adminApproved": 0,
"status": 0,
"_id": "5f3c22573065f84a48e04a14",
"file": "id=5f1939239bd35429ac9cd78f&dir=test&img=5f1939239bd35429ac9cd78f_image_undefined.jpeg",
"description": "test",
"fileType": "image",
"caption": "test file"
},
{
"adminApproved": 0,
"status": 0,
"_id": "5f3c2d7a8c7f8336b0bfced2",
"file": "id=5f1939239bd35429ac9cd78f&dir=test&img=5f1939239bd35429ac9cd78f_image_1.jpeg",
"description": "this is a demo poster for testing",
"fileType": "image",
"caption": "A Test Poster"
}
],
"createdAt": "2020-08-18T07:08:31.532Z",
"updatedAt": "2020-08-18T19:35:22.899Z",
"__v": 2
}
]
And the category in the above document is a separate one populated to this. the category collection as,
[
{
"_id": "5f19359250bcf9158c6be573",
"status": true,
"title": "Testing",
"description": "Application tester",
"code": "test",
"characteristics": [],
"createdAt": "2020-07-23T07:00:34.221Z",
"updatedAt": "2020-07-23T07:00:34.221Z",
"__v": 0
},
{
"status": true,
"_id": "5f29829a705b4e648c28bc88",
"title": "Designer",
"description": "UI UX Designer",
"code": "uiux",
"createdAt": "2020-08-04T15:45:30.125Z",
"updatedAt": "2020-08-04T15:45:30.125Z",
"__v": 0
},
{
"_id": "5f19357b50bcf9158c6be572",
"status": true,
"title": "programming",
"description": "Java programmer",
"code": "program",
"createdAt": "2020-07-23T07:00:11.137Z",
"updatedAt": "2020-07-23T07:00:11.137Z",
"__v": 0
}
]
So my filter terms will be;
{
categories: ["5f19359250bcf9158c6be573", "5f19357b50bcf9158c6be572"],
minAge: 18,
maxAge: 25,
minHeight: 5,
maxHeight: 6,
minWeight: 50,
maxWeight: 80,
complexion: "white",
gender: "male",
}
And the expected result will be a user have both the above talents and followed conditions,
{
users: { ..User details.. },
medias: { ...medias from the matching talents.. }
}
If there are two collections you need to join them either by primary key or _id with foriegn fields and you can use $lookup with $match to filter down.
Documentation
You need to use $lookup with pipeline,
$match you condition for category match
$lookup to join users collection
$match conditions for users collections fields
$match exclude documents that don't found matching users of criteria passed in conditions
db.talents.aggregate([
{
$match: {
category: { $in: ["5f19359250bcf9158c6be573", "5f19357b50bcf9158c6be572"] }
}
},
{
$lookup: {
from: "users",
as: "users",
let: { userId: "$userId" },
pipeline: [
{
$match: {
$expr: {
$and: [
{ $eq: ["$$userId", "$_id"] },
{ $eq: ["$gender", "Male"] },
{ $eq: ["$education", "Btech"] }
// ... add you other match criteria here
]
}
}
}
]
}
},
{ $match: { users: { $ne: [] } } }
])
Playground

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