выборка записей коллекции mongodb из нескольких коллекций с использованием nodejs - PullRequest
0 голосов
/ 28 января 2020

ниже - все описание коллекция 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 (" 5e2976cbcc1208c65c00690 c ") находится в одной коллекции пользователей
коллекция 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")

сценарий таков: я получу _id (то есть идентификатор администратора) от req.body Вот что мне нужно сделать 1: мне нужно знать все идентификаторы объекта mappedShops & чем для всех этих идентификаторов объекта, которые мне нужны чтобы найти детали всех этих objectId's 2: чем мне нужно посмотреть, какой заказ был создан магазином из коллекции заказов. (для всех этих идентификаторов) 3: чем мне нужно посмотреть, что является выдающимся из коллекции платежей (снова для всех Идентификаторы) Вот что мне нужно отправить во внешний интерфейс в указанном объекте Array {"name", "phoneNo", "address"} (из коллекции пользователей) + {"orderCreatedOn" : ISODate ("2020-01-22T18: 30: 00Z"), "isApproved"} (из коллекции заказов) + {"outst anding "} (из сбора платежей) ожидаемый ответ может выглядеть следующим образом:

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

POSTMAN REQUEST это идентификатор администратора

{
    "_id": "5e2977e1cc1208c65c00648b"
}

в конечном счете, передний конец получит все данные, которые я упомянул в shopsListDetails [{}] для всех mappedShops в коллекции пользователей с этим администратором Я очень застрял в этом, если любой может помочь мне

Ответы [ 2 ]

0 голосов
/ 28 января 2020

Пожалуйста, попробуйте это:

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

0 голосов
/ 28 января 2020

Учитывая, что ваша первая общая схема имеет 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. Во-первых, мы раскручиваем все mappedShops и получаем отдельные объекты из них из Lookups | Это дает нам данные пользователя для окончательных данных
  2. Затем мы находим соответствующий порядок для каждой коллекции mappedshops из orders по $lookup & $unwind same | Это дает нам детали заказа для окончательных данных
  3. Наконец, мы сопоставляем order_id внутри сбора платежей через $lookup и получаем статус оплаты каждого заказа | Это дает нам статус платежа для окончательных данных

PS: для этого работнику необходимо иметь запись каждого заказа как в коллекции orders & payments, независимо от того, завершен платеж или нет

Комментарий ниже, если вам нужно больше разъяснений / любые изменения необходимы здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...