Rahul Gour Ответов: 1

Как написать запрос mongo для объединения данных из двух документов


у меня есть два документа, один является userRole(роль Мастера), а другой пользователь(роль Asssociated с пользователя),пользователь может иметь несколько ролей, и есть некоторые права применяется на уровне пользователя и роль уровня оба , я хочу принести отдельные разрешения от пользователя и userRole для конкретного пользователя и связать несколько ролей данного пользователя.

 "userRole":{
    "_id" : ObjectId("58902f6b5d474004b4034026"),
    "roleName" : "Filler",
    "permission" : {
        "ActionPermissions" : {
            "Incidence Management" : {
                "Trouble Ticketing" : {
                    "Add Ticket" : {}
                }
            }
        }
    },
    "associatePermission" : {
        "ActionPermissions" : {
            "Incidence Management" : {
                "Trouble Ticketing" : {
                    "Add Ticket" : {},
                    "Bulk Closure" : true
                },
                "Ageing Report" : {
                    "Filter Report" : true
                }
            },
            "Preventive Maintenance" : {
                "Edit Ticket" : {
                    "Severity" : true
                }
            }
        },
        "DataPermissions" : {
            "Incidence Management" : {
                "Trouble Ticketing" : {
                    "Add Ticket" : {}
                }
            }
        }
    }
}


Что я уже пробовал:

"user": {
    "_id" : ObjectId("58a29743f7d4180a4cae827e"),
    "firstName" : "dileep",
    "roles" : [ 
        {
            "roleName" : {
                "_id" : "5890336b5d474004b403402c",
                "roleName" : "Ceo"
            },
            "effectiveFrom" : "2017-02-16T18:30:00.000Z",
            "effectiveTo" : "2017-02-28T18:30:00.000Z",
            "id" : {}
        }, 
        {
            "effectiveFrom" : "2017-02-16T18:30:00.000Z",
            "effectiveTo" : ISODate("2017-02-15T18:30:00.000Z"),
            "roleName" : "{\"_id\":\"5890335d5d474004b4034029\",\"roleName\":\"Engineer\"}"
        }, 
        {
            "roleName" : {
                "_id" : "5890336b5d474004b403402c",
                "roleName" : "Ceo"
            },
            "effectiveFrom" : "2017-02-16T18:30:00.000Z",
            "effectiveTo" : ISODate("2017-02-28T18:30:00.000Z"),
            "id" : {}
        }, 
        {
            "roleName" : {
                "_id" : "589033795d474004b403402f",
                "roleName" : "WebUser"
            },
            "id" : {}
        }, 
        {
            "roleName" : {
                "_id" : "58a69b9a93e8e20854282001",
                "roleName" : "surbhi",
                "roleDescription" : "surbhi"
            },
            "effectiveFrom" : "2017-02-23T18:30:00.000Z",
            "id" : 5
        }, 
        {
            "roleName" : {
                "_id" : "58aef573d90ffd185c96bb65",
                "roleName" : "ty",
                "roleDescription" : ""
            },
            "effectiveFrom" : "2017-02-23T18:30:00.000Z",
            "id" : 6
        }
    ],
    "groups" : [ 
        {
            "groupName" : {
                "_id" : "5891d9e75d4740205401bd68",
                "groupName" : "Power Vendor"
            },
            "effectiveFrom" : "2017-02-17T18:30:00.000Z",
            "id" : 1,
            "effectiveTo" : ISODate("2017-02-15T18:30:00.000Z")
        }, 
        {
            "groupName" : {
                "_id" : "5891d9f15d4740205401bd6b",
                "groupName" : "Tower Co"
            },
            "effectiveFrom" : "2017-02-21T18:30:00.000Z",
            "effectiveTo" : ISODate("2017-02-28T18:30:00.000Z"),
            "id" : 2
        }, 
        {
            "groupName" : {
                "_id" : "5891d9f15d4740205401bd6b",
                "groupName" : "Tower Co"
            },
            "effectiveFrom" : "2017-02-21T18:30:00.000Z",
            "effectiveTo" : ISODate("2017-02-21T18:30:00.000Z"),
            "id" : 2
        }, 
        {
            "groupName" : {
                "_id" : "58a6bfa3ea436926ac06a234",
                "groupName" : "asdasd",
                "groupDescription" : "asd"
            },
            "effectiveFrom" : "2017-02-27T18:30:00.000Z",
            "id" : 4
        }, 
        {
            "groupName" : {
                "_id" : "58a6958e93e8e20854282000",
                "groupName" : "anas",
                "groupDescription" : "this group is made for testing purpose."
            },
            "effectiveFrom" : "2017-02-20T18:30:00.000Z",
            "id" : 5,
            "effectiveTo" : ISODate("2017-02-21T18:30:00.000Z")
        }, 
        {
            "groupName" : {
                "_id" : "58a69dbb93e8e20854282002",
                "groupName" : "GP",
                "groupDescription" : "gp is for test"
            },
            "effectiveFrom" : "2017-02-23T18:30:00.000Z",
            "effectiveTo" : "2017-03-01T18:30:00.000Z",
            "id" : 6
        }, 
        {
            "effectiveFrom" : ISODate("2017-02-26T18:30:00.000Z"),
            "groupName" : {
                "groupName" : "Tower CoMPANY",
                "_id" : "5891d9f15d4740205401bd6b"
            },
            "effectiveTo" : null,
            "id" : 7
        }
    ],
    "profilePic" : "UserProfilePic-1487050584447.jpg",
    "loginId" : "dileep123",
    "password" : null,
    "confirmPassword" : null,
    "imeiNumber1" : "222222222222222222",
    "middleName" : "kumara",
    "lastName" : "saxenaaaaaa",
    "primaryEmail" : "ok@gmail.com",
    "primaryPhoneNumber" : "1111111111",
    "associatePermission" : {
        "ActionPermissions" : {
            "Incidence Management" : {},
            "User Management" : {
                "Users" : {
                    "View" : true,
                    "Add" : true
                }
            }
        },
        "DataPermissions" : {}
    }
}

Rahul Gour

нужно отдельное ассоциированное разрешение как от базы сбора на RoleID join..например, в коллекции пользователей, если у пользователя есть 2 разрешения и пользователь связан с 3 ролями, то все разрешения ролей должны быть приложены к этому документу,

выберите разрешение из роли
where roleID in (SELECT roleID from user where userID = 123)
Союз
Выберите разрешение от пользователя, где userID = 123;

я хочу написать запрос в MongoDB

1 Ответов

Рейтинг:
0

sachin.vishwa90

Привет, вам нужно использовать Aggregation framework здесь.вы можете проверить здесь

таким образом, ваш запрос будет выглядеть следующим образом
сначала вы сопоставляете пользователя с userid и передаете данные следующему оператору.
следующий оператор присоединит его к документу userrole, и вы сможете получить пользователя с его ролью в списке.

db.users.aggregate([{$match:{"userId":"youruserid"}},{$lookup:{from:"userRoles",localField:"userId",foreignField:"userId",as:"userWithRoleList"}},{$project:{"userId":1,userWithRoleList:1}}])

это должно сработать для вас.


Rahul Gour

@sachin.vishwa90, спасибо за ваше решение,
я попытался использовать вышеописанный общий запрос, но не смог найти желаемый вывод на самом деле (он вернет только существующую роль на входном пользователе) я хочу отдельное ассоциированное разрешение как от базы сбора на roleid join..например, в коллекции пользователей, если пользователь имеет 2 разрешения и пользователь связан с 3 ролями, то все разрешения ролей должны быть включены в этот документ.

sachin.vishwa90

привет, этот запрос был просто скелетом, чтобы показать вам соединение двух документов и передать результат следующему оператору, возможно, вам придется использовать оператор $unwind после соединения.
проверьте ссылку, которая была опубликована в моем решении. к тому времени я проверю данные, размещенные вами.

sachin.vishwa90

дБ.пользователей.с Aggregate([{$матч:{"параметр _id":"yourUserId"}},{$расслабиться:"$роли"},{$проект:{"$имя_роли.Параметр _id":1}},{$подстановки:{с:"userRole",localField:"параметр _id",foreignField:"параметр _id",как:"userPermissions"}}])

можете ли вы попробовать этот запрос?