Существуют различные способы моделирования вашего требования в текущей форме. Я попытаюсь показать вам один такой способ и использует $lookup. Вы должны попробовать с двумя отдельными коллекциями по одному для каждой группы и пользователям, как показано ниже.
Еще один вариант будет использовать $DBRef который охотно загрузку всех пользователей в группе, когда вы запрашиваете коллекции группы. Этот параметр будет зависеть от драйвера python, и я уверен, что драйвер поддерживает это.
Группы документов
{
"_id": ObjectId("5857e7d5aceaaa5d2254aea2"),
"name": "newGroup",
"usersId": ["user1", "user2"]
}
Пользователи Документ
{ "_id" : "user1", "isAdmin" : true }
{ "_id" : "user2" }
Получить все пользователи в группе
db.groups.aggregate({
$unwind: '$usersId'
}, {
$lookup: {
from: "users",
localField: "usersId",
foreignField: "_id",
as: "group_users"
}
})
Ответ
{
"_id": ObjectId("5857e7d5aceaaa5d2254aea2"),
"name": "newGroup",
"usersId": "user1",
"group_users": [{
"_id": "user1",
"isAdmin": true
}]
} {
"_id": ObjectId("5857e7d5aceaaa5d2254aea2"),
"name": "newGroup",
"usersId": "user2",
"group_users": [{
"_id": "user2"
}]
}
Получить все Admin Users в группе
db.groups.aggregate({
$unwind: '$usersId'
}, {
$lookup: {
from: "users",
localField: "usersId",
foreignField: "_id",
as: "group_users"
}
}, {
$match: {
"group_users.isAdmin": {
$exists: true
}
}
})
Response
{
"_id": ObjectId("5857e7d5aceaaa5d2254aea2"),
"name": "newGroup",
"usersId": "user1",
"group_users": [{
"_id": "user1",
"isAdmin": true
}]
}
Основываясь на комментарий:
Администратор для группы, поэтому я не могу сохранить его в таблице пользователей . Это отношение много-много.
Я думаю, вы должны включить как список обычных пользователей, так и список пользователей-администраторов. Это будет использовать индексы, которые вы добавите, и сделает ваши прочитанные запросы действительно прямолинейными.
Группы документов
{ "_id" : "newGroup", "userIds" : [ "user1" ], "adminIds" : [ "user2" ] }
Пользователи Документ
{ "_id" : "user1", "groupIds" : [ "newGroup" ] } -- regular user in newGroup
{ "_id" : "user2", "groupIds" : [ "newGroup" ] } -- admin user in newGroup.
{ "_id" : "user3", "groupIds" : [ ] }
Получить все регулярные пользователи
db.groups.aggregate({
$unwind: '$userIds'
}, {
$lookup: {
from: "users",
localField: "userIds",
foreignField: "_id",
as: "group_users"
}
})
Получить Все администраторы Пользователи
db.groups.aggregate({
$unwind: '$adminIds'
}, {
$lookup: {
from: "users",
localField: "adminIds",
foreignField: "_id",
as: "group_users"
}
})
является админ админ для группы, поэтому я не могу сохранить его в таблице пользователей. Это отношение много-много. – Jhorra
Пара вопросов здесь. Многие для многих означают, что пользователь знает, какая группа он является частью смысла, у вас будет список групп в каждом пользовательском документе? Другой вопрос Как вы выбираете пользователя в качестве администратора? Это то, что вы назначаете некоторым пользователям в качестве администратора для каждой группы при создании группы? Обновленный ответ на основе этого комментария. – Veeram
Итак, это приложение имеет различные местоположения. Пользователи имеют доступ к местам, к которым они привязаны. Администраторы в каждом месте имеют разрешения на редактирование этого местоположения. Пользователь может быть присоединен ко многим группам, и у группы есть много пользователей. Некоторые пользователи каждой группы будут администраторами. Поэтому в других случаях от многих до многих я видел, как они использовали список пользователей в группе и список групп для каждого пользователя. Мне нужно это сделать, но также указать, являетесь ли вы администратором. – Jhorra