2016-12-17 7 views
4

У меня есть ситуация, когда у меня есть тип документа группы. Я хочу иметь поле списка, которое содержит идентификатор ссылки для пользователей в группе. Мне нужно указать, какие пользователи имеют доступ администратора. Должен ли я иметь два списка, один из обычных пользователей и один из админов или иметь собственный документ, который я встраиваю в список, который имеет только идентификатор ссылки и значение bool? Это в основном много для многих, причем оба документа имеют список ссылочных идентификаторов для других документов. Я просто не знаю, как включить эту другую ценность.MongoDB: ссылка на другой документ с дополнительной информацией

Если это делает никакой разницы, я использую Python/Mongoengine, чтобы получить доступ к MongoDB

ответ

2

Существуют различные способы моделирования вашего требования в текущей форме. Я попытаюсь показать вам один такой способ и использует $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" 
    } 
}) 
+0

является админ админ для группы, поэтому я не могу сохранить его в таблице пользователей. Это отношение много-много. – Jhorra

+0

Пара вопросов здесь. Многие для многих означают, что пользователь знает, какая группа он является частью смысла, у вас будет список групп в каждом пользовательском документе? Другой вопрос Как вы выбираете пользователя в качестве администратора? Это то, что вы назначаете некоторым пользователям в качестве администратора для каждой группы при создании группы? Обновленный ответ на основе этого комментария. – Veeram

+0

Итак, это приложение имеет различные местоположения. Пользователи имеют доступ к местам, к которым они привязаны. Администраторы в каждом месте имеют разрешения на редактирование этого местоположения. Пользователь может быть присоединен ко многим группам, и у группы есть много пользователей. Некоторые пользователи каждой группы будут администраторами. Поэтому в других случаях от многих до многих я видел, как они использовали список пользователей в группе и список групп для каждого пользователя. Мне нужно это сделать, но также указать, являетесь ли вы администратором. – Jhorra

 Смежные вопросы

  • Нет связанных вопросов^_^