簡體   English   中英

使用nodejs從多個集合中獲取mongodb集合記錄

[英]fetching mongodb collection records from multiple collections using nodejs

以下是所有描述集合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"

注意mappedShops 的詳細信息,例如: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 和所有那些 objectId 我需要找到所有這些 objectId 的詳細信息 2 :比我需要查看商店從訂單集合中創建的訂單。(對於所有這些 ID) 3:比我需要查看付款集合中的未付款項(再次對於所有 ID)這是我需要的發送到提到的對象數組中的前端{"name","phoneNo","address"}(from users collection)+{"orderCreatedOn": ISODate("2020-01-22T18:30:00Z"),"isApproved "}(來自訂單收款)+{"outstanding"}(來自付款收款)預期響應可能如下所示:

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

POSTMAN REQUEST這是管理員的 id

{
    "_id": "5e2977e1cc1208c65c00648b"
}

最終前端將收到我在shopsListDetails[{}] 中提到的所有數據,用於針對該管理員的用戶集合中的所有mappedShops,如果有任何可以幫助我的話我非常陷入困境

考慮到您共享的第一個架構是User

我假設您正在payments Schemama 中存儲order_id

您可以像這樣編寫聚合查詢

    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. 首先,我們展開所有映射的商店並從 Lookups | 中獲取相同的單個對象。 這為我們提供了最終數據的用戶詳細信息
  2. 然后,我們通過$lookup$unwind same | 從orders集合中找到每個mappedshops匹配訂單。 這為我們提供了最終數據的訂單詳細信息
  3. 最后,我們通過$lookup匹配付款集合中的order_id並獲取每個訂單的付款狀態 | 這為我們提供了最終數據的付款狀態

PS:對於這個工作人員,您必須在orderspayments收集中輸入每個orders ,無論付款是否完成

如果您需要更多說明/此處需要任何更改,請在下面發表評論

請試試這個:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM