Related
I have a category Model which looks like this
const mongoose = require("mongoose");
const { Schema } = mongoose;
const { ObjectId } = Schema;
const category = {
name: {
type: String,
required: true,
trim: true,
max: 32,
unique: true,
},
subCategories: [
{
type: Schema.Types.ObjectId,
ref: "Category",
},
],
parent: {
type: Schema.Types.ObjectId,
ref: "Category",
},
products: [
{
type: ObjectId,
ref: "Product",
},
],
slug: {
type: String,
required: "URL can't be empty",
unique: true,
},
};
const categorySchema = new Schema(category, { timestamps: true });
//Validate the slug to ensure proper url is given
categorySchema.path("slug").validate((val) => {
urlRegex =
/(ftp|http|https):\/\/(\w+:{0,1}\w*#)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%#!\-/]))?/;
return urlRegex.test(val);
}, "Invalid URL.");
const autoPopulateChildren = function (next) {
this.populate("subCategories");
next();
};
categorySchema
.pre("findOne", autoPopulateChildren)
.pre("findById", autoPopulateChildren)
.pre("find", autoPopulateChildren);
const Category = mongoose.model("Category", categorySchema);
module.exports = Category;
I would like to recursively populate its parent.
Right now, I have a data that looks like this
Main
-> Computers & Accessories
-> Components
-> Motherboard
When I query Motherboard category, I would like it to return back all its parents (all the way up to Main category). Something like this
{
"subCategories": [],
"products": [],
"_id": "62baca1a1ffdc142085bca80",
"name": "Motherboard",
"parent": {
"subCategories": [
{
"subCategories": [],
"products": [],
"_id": "62baca1a1ffdc142085bca80",
"name": "Motherboard",
"parent": "62bac5af6b6581786cb192e4",
"slug": "http://localhost:4007/category/motherboard",
"createdAt": "2022-06-28T09:30:02.040Z",
"updatedAt": "2022-06-28T09:30:02.040Z",
"__v": 0
},
{
"subCategories": [],
"products": [],
"_id": "62bac9a24bd73045dcb563d7",
"name": "RAM",
"parent": "62bac5af6b6581786cb192e4",
"slug": "http://localhost:4007/category/ram",
"createdAt": "2022-06-28T09:28:02.643Z",
"updatedAt": "2022-06-28T09:28:02.643Z",
"__v": 0
}
],
"products": [],
"_id": "62bac5af6b6581786cb192e4",
"name": "components",
"parent": {
"subCategories": [
{
"subCategories": [
{
"subCategories": [],
"products": [],
"_id": "62baca1a1ffdc142085bca80",
"name": "Motherboard",
"parent": "62bac5af6b6581786cb192e4",
"slug": "http://localhost:4007/category/motherboard",
"createdAt": "2022-06-28T09:30:02.040Z",
"updatedAt": "2022-06-28T09:30:02.040Z",
"__v": 0
},
{
"subCategories": [],
"products": [],
"_id": "62bac9a24bd73045dcb563d7",
"name": "RAM",
"parent": "62bac5af6b6581786cb192e4",
"slug": "http://localhost:4007/category/ram",
"createdAt": "2022-06-28T09:28:02.643Z",
"updatedAt": "2022-06-28T09:28:02.643Z",
"__v": 0
}
],
"products": [],
"_id": "62bac5af6b6581786cb192e4",
"name": "components",
"parent": "62bac35ba30786989841809b",
"slug": "http://localhost:4007/category/components",
"createdAt": "2022-06-28T09:11:11.226Z",
"updatedAt": "2022-06-28T09:11:11.226Z",
"__v": 0
},
{
"subCategories": [
{
"subCategories": [],
"products": [],
"_id": "62bacae4da4c372c48c4a996",
"name": "Huawei",
"parent": "62bac6696b6581786cb192e7",
"slug": "http://localhost:4007/category/huawei",
"createdAt": "2022-06-28T09:33:24.218Z",
"updatedAt": "2022-06-28T09:33:24.218Z",
"__v": 0
},
{
"subCategories": [],
"products": [],
"_id": "62bacb137e6e0b6ac850b9ce",
"name": "Apple",
"parent": "62bac6696b6581786cb192e7",
"slug": "http://localhost:4007/category/apple",
"createdAt": "2022-06-28T09:34:11.549Z",
"updatedAt": "2022-06-28T09:34:11.549Z",
"__v": 0
}
],
"products": [],
"_id": "62bac6696b6581786cb192e7",
"name": "laptop",
"parent": "62bac35ba30786989841809b",
"slug": "http://localhost:4007//category/laptop",
"createdAt": "2022-06-28T09:14:17.650Z",
"updatedAt": "2022-06-28T09:14:17.650Z",
"__v": 0
},
{
"subCategories": [
{
"subCategories": [],
"products": [],
"_id": "62bacb65045848303cd21b67",
"name": "Gaming",
"parent": "62bac8016b6581786cb192f0",
"slug": "http://localhost:4007/category/gaming",
"createdAt": "2022-06-28T09:35:33.414Z",
"updatedAt": "2022-06-28T09:35:33.414Z",
"__v": 0
},
{
"subCategories": [],
"products": [],
"_id": "62bacc72e84e007314a97abe",
"name": "DIY",
"parent": "62bac8016b6581786cb192f0",
"slug": "http://localhost:4007/category/diy",
"createdAt": "2022-06-28T09:40:02.359Z",
"updatedAt": "2022-06-28T09:40:02.359Z",
"__v": 0
}
],
"products": [],
"_id": "62bac8016b6581786cb192f0",
"name": "Desktop",
"parent": "62bac35ba30786989841809b",
"slug": "http://localhost:4007//category/components",
"createdAt": "2022-06-28T09:21:05.807Z",
"updatedAt": "2022-06-28T09:21:05.807Z",
"__v": 0
}
],
"products": [],
"_id": "62bac35ba30786989841809b",
"name": "Computers & Accessories",
"parent": {
"subCategories": [
{
"subCategories": [
{
"subCategories": [
{
"subCategories": [],
"products": [],
"_id": "62baca1a1ffdc142085bca80",
"name": "Motherboard",
"parent": "62bac5af6b6581786cb192e4",
"slug": "http://localhost:4007/category/motherboard",
"createdAt": "2022-06-28T09:30:02.040Z",
"updatedAt": "2022-06-28T09:30:02.040Z",
"__v": 0
},
{
"subCategories": [],
"products": [],
"_id": "62bac9a24bd73045dcb563d7",
"name": "RAM",
"parent": "62bac5af6b6581786cb192e4",
"slug": "http://localhost:4007/category/ram",
"createdAt": "2022-06-28T09:28:02.643Z",
"updatedAt": "2022-06-28T09:28:02.643Z",
"__v": 0
}
],
"products": [],
"_id": "62bac5af6b6581786cb192e4",
"name": "components",
"parent": "62bac35ba30786989841809b",
"slug": "http://localhost:4007/category/components",
"createdAt": "2022-06-28T09:11:11.226Z",
"updatedAt": "2022-06-28T09:11:11.226Z",
"__v": 0
},
{
"subCategories": [
{
"subCategories": [],
"products": [],
"_id": "62bacae4da4c372c48c4a996",
"name": "Huawei",
"parent": "62bac6696b6581786cb192e7",
"slug": "http://localhost:4007/category/huawei",
"createdAt": "2022-06-28T09:33:24.218Z",
"updatedAt": "2022-06-28T09:33:24.218Z",
"__v": 0
},
{
"subCategories": [],
"products": [],
"_id": "62bacb137e6e0b6ac850b9ce",
"name": "Apple",
"parent": "62bac6696b6581786cb192e7",
"slug": "http://localhost:4007/category/apple",
"createdAt": "2022-06-28T09:34:11.549Z",
"updatedAt": "2022-06-28T09:34:11.549Z",
"__v": 0
}
],
"products": [],
"_id": "62bac6696b6581786cb192e7",
"name": "laptop",
"parent": "62bac35ba30786989841809b",
"slug": "http://localhost:4007//category/laptop",
"createdAt": "2022-06-28T09:14:17.650Z",
"updatedAt": "2022-06-28T09:14:17.650Z",
"__v": 0
},
{
"subCategories": [
{
"subCategories": [],
"products": [],
"_id": "62bacb65045848303cd21b67",
"name": "Gaming",
"parent": "62bac8016b6581786cb192f0",
"slug": "http://localhost:4007/category/gaming",
"createdAt": "2022-06-28T09:35:33.414Z",
"updatedAt": "2022-06-28T09:35:33.414Z",
"__v": 0
},
{
"subCategories": [],
"products": [],
"_id": "62bacc72e84e007314a97abe",
"name": "DIY",
"parent": "62bac8016b6581786cb192f0",
"slug": "http://localhost:4007/category/diy",
"createdAt": "2022-06-28T09:40:02.359Z",
"updatedAt": "2022-06-28T09:40:02.359Z",
"__v": 0
}
],
"products": [],
"_id": "62bac8016b6581786cb192f0",
"name": "Desktop",
"parent": "62bac35ba30786989841809b",
"slug": "http://localhost:4007//category/components",
"createdAt": "2022-06-28T09:21:05.807Z",
"updatedAt": "2022-06-28T09:21:05.807Z",
"__v": 0
}
],
"products": [],
"_id": "62bac35ba30786989841809b",
"name": "Computers & Accessories",
"parent": "62bac6eddfe90a7c09873d92",
"slug": "http://localhost:4007/category/computers&accessories",
"createdAt": "2022-06-28T09:01:15.666Z",
"updatedAt": "2022-06-28T09:01:15.666Z",
"__v": 0
}
],
"products": [],
"_id": "62bac6eddfe90a7c09873d92",
"name": "Main Shop Name",
"parent": null,
"slug": "http://localhost:4007/category/main",
"createdAt": "2022-06-28T09:01:15.666Z",
"updatedAt": "2022-06-28T09:01:15.666Z",
"__v": 0
},
"slug": "http://localhost:4007/category/computers&accessories",
"createdAt": "2022-06-28T09:01:15.666Z",
"updatedAt": "2022-06-28T09:01:15.666Z",
"__v": 0
},
"slug": "http://localhost:4007/category/components",
"createdAt": "2022-06-28T09:11:11.226Z",
"updatedAt": "2022-06-28T09:11:11.226Z",
"__v": 0
},
"slug": "http://localhost:4007/category/motherboard",
"createdAt": "2022-06-28T09:30:02.040Z",
"updatedAt": "2022-06-28T09:30:02.040Z",
"__v": 0
}
Following is my code
const populateParents = async (node) => {
if (node.parent) {
let newNode = await Category.populate(node, { path: "parent" });
return populateParents(newNode.parent);
}
return node;
};
//Routes
router.get("/categories/:categoryId", [RequireSignIn], async (req, res) => {
try {
const { categoryId } = req.params;
const category = await Category.findOne({ _id: categoryId });
const populatedCategories = await populateParents(category);
return res.status(200).send(populatedCategories);
} catch (error) {
return res.status(500).send(error);
}
});
What I am getting back is only the Main category in response.
{
"subCategories": [
{
"subCategories": [
{
"subCategories": [
{
"subCategories": [],
"products": [],
"_id": "62baca1a1ffdc142085bca80",
"name": "Motherboard",
"parent": "62bac5af6b6581786cb192e4",
"slug": "http://localhost:4007/category/motherboard",
"createdAt": "2022-06-28T09:30:02.040Z",
"updatedAt": "2022-06-28T09:30:02.040Z",
"__v": 0
},
{
"subCategories": [],
"products": [],
"_id": "62bac9a24bd73045dcb563d7",
"name": "RAM",
"parent": "62bac5af6b6581786cb192e4",
"slug": "http://localhost:4007/category/ram",
"createdAt": "2022-06-28T09:28:02.643Z",
"updatedAt": "2022-06-28T09:28:02.643Z",
"__v": 0
}
],
"products": [],
"_id": "62bac5af6b6581786cb192e4",
"name": "components",
"parent": "62bac35ba30786989841809b",
"slug": "http://localhost:4007/category/components",
"createdAt": "2022-06-28T09:11:11.226Z",
"updatedAt": "2022-06-28T09:11:11.226Z",
"__v": 0
},
{
"subCategories": [
{
"subCategories": [],
"products": [],
"_id": "62bacae4da4c372c48c4a996",
"name": "Huawei",
"parent": "62bac6696b6581786cb192e7",
"slug": "http://localhost:4007/category/huawei",
"createdAt": "2022-06-28T09:33:24.218Z",
"updatedAt": "2022-06-28T09:33:24.218Z",
"__v": 0
},
{
"subCategories": [],
"products": [],
"_id": "62bacb137e6e0b6ac850b9ce",
"name": "Apple",
"parent": "62bac6696b6581786cb192e7",
"slug": "http://localhost:4007/category/apple",
"createdAt": "2022-06-28T09:34:11.549Z",
"updatedAt": "2022-06-28T09:34:11.549Z",
"__v": 0
}
],
"products": [],
"_id": "62bac6696b6581786cb192e7",
"name": "laptop",
"parent": "62bac35ba30786989841809b",
"slug": "http://localhost:4007//category/laptop",
"createdAt": "2022-06-28T09:14:17.650Z",
"updatedAt": "2022-06-28T09:14:17.650Z",
"__v": 0
},
{
"subCategories": [
{
"subCategories": [],
"products": [],
"_id": "62bacb65045848303cd21b67",
"name": "Gaming",
"parent": "62bac8016b6581786cb192f0",
"slug": "http://localhost:4007/category/gaming",
"createdAt": "2022-06-28T09:35:33.414Z",
"updatedAt": "2022-06-28T09:35:33.414Z",
"__v": 0
},
{
"subCategories": [],
"products": [],
"_id": "62bacc72e84e007314a97abe",
"name": "DIY",
"parent": "62bac8016b6581786cb192f0",
"slug": "http://localhost:4007/category/diy",
"createdAt": "2022-06-28T09:40:02.359Z",
"updatedAt": "2022-06-28T09:40:02.359Z",
"__v": 0
}
],
"products": [],
"_id": "62bac8016b6581786cb192f0",
"name": "Desktop",
"parent": "62bac35ba30786989841809b",
"slug": "http://localhost:4007//category/components",
"createdAt": "2022-06-28T09:21:05.807Z",
"updatedAt": "2022-06-28T09:21:05.807Z",
"__v": 0
}
],
"products": [],
"_id": "62bac35ba30786989841809b",
"name": "Computers & Accessories",
"parent": "62bac6eddfe90a7c09873d92",
"slug": "http://localhost:4007/category/computers&accessories",
"createdAt": "2022-06-28T09:01:15.666Z",
"updatedAt": "2022-06-28T09:01:15.666Z",
"__v": 0
}
],
"products": [],
"_id": "62bac6eddfe90a7c09873d92",
"name": "Main Shop Name",
"parent": null,
"slug": "http://localhost:4007/category/main",
"createdAt": "2022-06-28T09:01:15.666Z",
"updatedAt": "2022-06-28T09:01:15.666Z",
"__v": 0
}
If I write the function without recursion , it works
const populateParents2 = async (node) => {
const newNode = await Category.populate(node, { path: "parent" });
const newNode2 = await Category.populate(newNode.parent, { path: "parent" });
const newNode3 = await Category.populate(newNode2.parent, { path: "parent" });
return newNode;
};
So appreciate if someone can point out how to write populateParents function recursively or is there another better way to do this
Thank you
Question very similar to this question Create a deeply nested object
Btw found the solution for this question
const populateParents = async (node) => {
if (node.parent === null) {
return node;
}
const parent = await Category.findById(node.parent).select("-subCategories");
node.parent = parent;
await populateParents(node.parent);
return node;
};
//Routes
router.get("/categories/:categoryId", async (req, res) => {
try {
const { categoryId } = req.params;
const category = await Category.findOne({ _id: categoryId }).select(
"-subCategories"
);
const populatedCategories = await populateParents(category);
return res.status(200).send(populatedCategories);
} catch (error) {
return res.status(500).send(error);
}
});
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);
})
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"
}
})
I have a database of exercises in a workout tracker, and when I do a find(), the result is this:
[
{
"_id": "5e9dacbb6512969974bd5b2d",
"day": "2020-04-10T14:07:55.905Z",
"exercises": [
{
"type": "resistance",
"name": "Bicep Curl",
"duration": 20,
"weight": 100,
"reps": 10,
"sets": 4
}
]
},
{
"_id": "5e9dacbb6512969974bd5b2e",
"day": "2020-04-11T14:07:55.916Z",
"exercises": [
{
"type": "resistance",
"name": "Lateral Pull",
"duration": 20,
"weight": 300,
"reps": 10,
"sets": 4
}
]
},
{
"_id": "5e9dacbb6512969974bd5b2f",
"day": "2020-04-12T14:07:55.916Z",
"exercises": [
{
"type": "resistance",
"name": "Push Press",
"duration": 25,
"weight": 185,
"reps": 8,
"sets": 4
}
]
},
{
"_id": "5e9dacbb6512969974bd5b30",
"day": "2020-04-13T14:07:55.916Z",
"exercises": [
{
"type": "cardio",
"name": "Running",
"duration": 25,
"distance": 4
}
]
},
{
"_id": "5e9dacbb6512969974bd5b31",
"day": "2020-04-14T14:07:55.916Z",
"exercises": [
{
"type": "resistance",
"name": "Bench Press",
"duration": 20,
"weight": 285,
"reps": 10,
"sets": 4
}
]
},
{
"_id": "5e9dacbb6512969974bd5b32",
"day": "2020-04-15T14:07:55.916Z",
"exercises": [
{
"type": "resistance",
"name": "Bench Press",
"duration": 20,
"weight": 300,
"reps": 10,
"sets": 4
}
]
},
{
"_id": "5e9dacbb6512969974bd5b33",
"day": "2020-04-16T14:07:55.916Z",
"exercises": [
{
"type": "resistance",
"name": "Quad Press",
"duration": 30,
"weight": 300,
"reps": 10,
"sets": 4
}
]
},
{
"_id": "5e9dacbb6512969974bd5b34",
"day": "2020-04-17T14:07:55.916Z",
"exercises": [
{
"type": "resistance",
"name": "Bench Press",
"duration": 20,
"weight": 300,
"reps": 10,
"sets": 4
}
]
},
{
"_id": "5e9dacbb6512969974bd5b35",
"day": "2020-04-18T14:07:55.916Z",
"exercises": [
{
"type": "resistance",
"name": "Military Press",
"duration": 20,
"weight": 300,
"reps": 10,
"sets": 4
}
]
},
{
"_id": "5e9dacbb6512969974bd5b36",
"day": "2020-04-19T14:07:55.916Z",
"exercises": [
{
"type": "resistance",
"name": "Bench",
"duration": 30,
"distance": 2
}
]
}
]
Then I need to get total sums of statistics from each exercise, so I used mongoose aggregate to give me this data:
[
{
"_id": null,
"totalDuration": 230,
"totalWeight": 2070,
"totalSets": 32,
"totalReps": 78,
"totalDistance": 6
}
]
I want to combine these two results in one GET request, ideally doing something similar to a push where I just push the totals at the end of the first JSON object. How do I achieve this?
Something like this:
function mergeResults(resultFromFindQuery, totalSums){
var allData = {};
allData['mongoFindresult'] = resultFromFindQuery;
allData['totalSums'] = totalSums;
return allData;
}
Then use the returned value to what you need to do. Now you have both of them in the same variable.
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