使用 NodeJS 从多个集合中获取 MongoDB 集合记录



以下是所有描述集合 1:用户

"_id" : ObjectId("5e2977e1cc1208c65c00648b"),
"mappedShops" : [
ObjectId("5e2976cbcc1208c65c006488"),
ObjectId("5e2976cbcc1208c65c00690c"),
ObjectId("5e2976cbcc1208c65c006499")
"phoneNo" : 6789012345,
"name" : "acdbcs",
"address" : "address 2",
"shopCode" : "D3137",
"state" : "M.P",
"city" : "Indore"

注意映射商店的详细信息,例如:ObjectId("5e2976cbcc1208c65c00690c"(在同一用户集合集合
2 中:订单

"_id" : ObjectId("5e27f998a42d441fe8a8957f"),
"isApproved" : false,
"orderCreatedOn" : ISODate("2020-01-22T18:30:00Z"),
"shopOrder" : [],
"frequency" : "WE",
"orderCreatedBy" : ObjectId("5e2976cbcc1208c65c00690c")

收款 3:付款

"_id" :  ObjectId("5dd7900bcd00d33c245abbfa"),
"paymentOfTheDay" : 400,
"outstanding" : 100,
"paymentDoneBy":ObjectId("5e2976cbcc1208c65c00690c")

场景是:我将从 req.body 获取_id(即管理员 ID( 这是我需要做的1:我需要知道所有映射的商店 objectId 和比所有这些对象 ID 我需要找到所有这些对象 ID 的详细信息 2:比我需要查看该商店从订单收集中创建的订单。(对于所有这些身份证( 3:比我需要查看付款收集中的未结清金额(再次针对所有ID( 这是我需要发送到上述对象数组中的前端的内容 {">name","phoneNo","address"}(来自用户集合(+{"orderCreatedOn": ISODate("2020-01-22T18:30:00Z"(,"isApproved"}(来自订单收集(+{"未完成"}(来自付款收集(预期响应可能如下所示:

"shopsListDetails":[{
"phoneNo","name","address","shopCode" ,"isApproved","outstanding"
}]

邮递员请求这是管理员的ID

{
"_id": "5e2977e1cc1208c65c00648b"
}

最终,前端将接收我在 shopsListDetails[{}] 中提到的所有数据,用于针对该管理员的用户集合中的所有映射商店,如果有人可以帮助我,我有点陷入困境

请尝试以下操作:

db.users.aggregate([
{
$match: {
_id: req.body.adminID
}
}, {
$lookup: {
from: 'users',
localField: 'mappedShops',
foreignField: '_id',
as: 'mappedShops'
}
}, { $unwind: '$mappedShops'}, { $replaceRoot: { newRoot: "$mappedShops" } },
{ 
$lookup:
{
from: "orders",
let: { mappedShopsId: "$_id" },
pipeline: [
{
$match: { $expr: { $eq: ["$orderCreatedBy", "$$mappedShopsId"] } }
},
{ $project: { orderCreatedOn: 1, isApproved: 1 } }
],
as: "orders"
}
},{
$lookup:
{
from: "payments",
let: { mappedShopsId: "$_id" },
pipeline: [
{
$match: { $expr: { $eq: ["$paymentDoneBy", "$$mappedShopsId"] } }
},
{ $project: { outstanding: 1 } }
],
as: "payments"
}
},
{ $project: { name: 1, phoneNo: 1, address: 1, shopCode: 1, orders: 1, payments: 1 } }
])

测试:MongoDB-Playground

考虑到您共享的第一个模式是User

我假设您将order_id存储在payments架构中

您可以像这样编写聚合查询

User.aggregate([
{
$match:{
_id:req.body.admin_id
}
},{
$unwind:'$mappedShops'
},{
$lookup:{
from:'users',
localField:'mappedShops',
foreignField:'_',
as:'mappedShops'
}
},{
$unwind:'$mappedShops'
},{
$lookup:{
from:'orders',
localField:'mappedShops._id',
foreignField:'orderCreatedBy',
as:'order'
}
},{
$unwind:'$order'
},{
$lookup:{
from:'payments',
localField:'order._id',
foreignField:'order_id',
as:'payment'
}
},{
$unwind:'$payment'
},{
$project:{
_id:0,
name:'$mappedShops.name',
phoneNo:'$mappedShops.phoneNo',
address:'$mappedShops.address',
orderCreatedOn:'$order.orderCreatedOn',
isApproved:'$order.isApproved',
outstanding:'$payment.outstanding'
}
}
])
  1. 首先,我们展开所有映射的商店,并从查找中获取相同的单个对象 |这为我们提供了最终数据的用户详细信息
  2. 然后,我们通过$lookup$unwind找到orders集合中每个mappedshops的匹配顺序 |这为我们提供了最终数据的订单详细信息
  3. 最后,我们通过$lookup匹配order_id内部收款并获取每个订单的付款状态 |这为我们提供了最终数据的付款状态

PS :对于工人,无论付款是否完成,您都必须在orderspayments收集中输入每个订单

如果您需要更多说明/需要在此处进行任何更改,请在下面发表评论

最新更新