2015-10-28 2 views
0

Не совсем уверен, что такое лучшая практика, если у меня есть две коллекции, коллекция пользователей и коллекция изображений. Я не хочу вставлять все мои фотографии в свою коллекцию пользователей.Схема на mongodb для сокращения вызовов API с двумя коллекциями

  1. Мой клиент ищет фотографии по определенным критериям. Предположим, он получил 50 фотографий из поиска (т. Е. Один запрос mongodb). Каждое изображение связано с одним пользователем. Я также хочу, чтобы имя пользователя отображалось. Я предполагаю, что нет никакого способа сделать один результат поиска мудрую в коллекции пользователей, возвращая имена каждого пользователя для каждого изображения, то есть мне нужно будет выполнить 50 поисков. Это означает, что я мог бы избежать этой дополнительной загрузки производительности путем дублирования данных (рядом с user_id, а также имя пользователя) в моей коллекции изображений?

  2. Тот же вопрос, наоборот. Если мой клиент ищет пользователей и говорит, что 50 пользователей возвращаются из поиска по одному запросу. Если я хочу, чтобы последнее связанное изображение + заголовок также отображалось рядом с пользовательскими данными, я снова должен добавить это в коллекцию пользователей, иначе я предполагаю, что мне нужно сделать 50 запросов, чтобы вернуть данные изображения?

+1

Это правильно, у вас есть два варианта без изменения структуры ваших коллекций. 1. Храните ссылку на пользователей в вашей коллекции изображений, которая возвращает ассоциированные пользователи с изображением или дублирует данные. Документация для этого находится здесь https://docs.mongodb.org/manual/reference/database-references/. – user2263572

ответ

2

Допустим, схема для вашей коллекции картины как таковой:

Изображение документа

{ 
    _id: Objectid(123), 
    url: 'img1.jpg', 
    title: 'img_one', 
    userId: Objectid(342) 
} 

1) Ваш запрос изображение будет возвращать документы, которые выглядят как выше. Вам не нужно делать 50 звонков, чтобы связать пользователя с изображениями. Вы можете просто сделать другого запроса к Users Collection с использованием идентификаторов пользователей, взятые из изображения документов, как, например:

db.users.find({_id: {$in[userid_1,user_id2,userid_3,...,userid_n]}}) 

Вы получите массив пользовательских документов с информацией о пользователе. После этого вам придется обрабатывать их отображение на клиенте. В лучшем случае вам понадобится звонков.

Альтернативно

Вы могли бы разработать схему, как, например:

Изображение документа

{ 
    _id: Objectid(123), 
    url: 'img1.jpg', 
    title: 'img_one', 
    userId: Objectid(342), 
    user_name:"user associated" 
} 

Если дизайн это таким образом. Вам потребуется только звонок, , но имя пользователя не будет синхронизироваться с документами пользовательских коллекций. Например, скажем, пользователь меняет свое имя. Картинка, которая была сохранена ранее, может иметь старое имя пользователя.

2) Вы можете создать свой Коллекцию пользователя, как, например:

Документ пользователя

{ 
    _id: Objectid(342), 
    name: "Steve jobs", 
    last_assoc_img: { 
      img_id: Object(342) 
      url: 'img_one', 
      title: 'last image title 
    } 
} 

Вы можете использовать те же принципы, как уже упоминалось выше.

+0

спасибо, вот что я получаю. Знаете ли вы, что такие вызовы: db.users.find ({_ id: {$ in [userid_1, user_id2, userid_3, ..., userid_n]}}) масштаб? То есть, если технически не выполнять 50 вызовов, будет ли он с точки зрения загрузки базы данных соответствовать 50 запросам? – user753416

+0

только что понял, что я только сказал «спасибо», я имел в виду «действительно, большое спасибо за то, что нашел время для подробного ответа, очень ценного» – user753416

+0

Your'e Welcome. Я рад, что смогу помочь. Да, эта шкала запросов. Он не будет похож на 50 запросов. Вы должны использовать индексирование в userId, если вы будете часто запрашивать его. Вы можете увидеть оптимизацию запросов [здесь] (https://docs.mongodb.org/manual/tutorial/optimize-query-performance-with-indexes-and-projections/): – inspired

1

Если предположить, что у вас есть userid, связанный с каждым user и вы также хранения, что id в picture документе, то ваш user < =>picture является слабо связаны отношениями.

Чтобы не было необходимости совершать 50 отдельных вызовов, вы можете использовать $in operator, учитывая, что вы можете вытащить те id и положить их в список для запуска второго запроса. Ваш запрос будет в основном на английском языке: «Посмотрите на сборник, если он находится в списке id, отдайте его мне».

Если вы намерены сделать это много и намереваетесь его масштабировать, я бы рекомендовал использовать реляционную базу данных или базу данных NoSQL, которая может обрабатывать объединения, чтобы не принуждать вас во встроенную схему документов.