mongodb получает информацию о пользователе для каждого документа - PullRequest
1 голос
/ 26 декабря 2011

Я пытаюсь отобразить форум / категорию. Мне нужно, чтобы получить последние сообщения. Проблема в том, что мне также нужны данные о пользователе для каждого сообщения, а также последний ответ.

db.post.find({
  "inForum": forumID,
},
{
  'sort': [['date', -1]]
},
function(err, cursor) {
  cursor.count(function(err, count) {
    cursor.skip(skip).limit(20).toArray(function(err, posts) {
      var complete = _.after(nodes.length, function () {
        res.send(posts)
      });

      // for every post get its author info and the latest post info
      posts.forEach(function (post) {
        var users = _.pluck(posts, 'user');
        user.load(users, function (profiles) {
          _.each(posts,
          function(post, k) {
            if (profiles[post.user]) post.fieldAvatar = profiles[post.user].fieldAvatar;
          });

          if (post.latestReply) {
            post.load(post.latestReply.id, function (latestReply) {
              if (latestReply) post.latestReply = latestReply
              complete()
            })
          }
          else {
            complete()
          }
        })
      })
    });
  })
})

Это то, что я делаю, и это кажется мне очень медленным / действительно не элегантным. Я делаю это правильно, и есть ли какой-нибудь совет для ускорения этого?

Спасибо.

Ответы [ 2 ]

3 голосов
/ 26 декабря 2011

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

Если вы не хотите / не можете этого сделать, вы также можете изменить второй запрос, чтобы найти всех авторов в [array_of_ids_of_the_posts].Это уменьшит ваши [number_of_posts] запросы только до одного.

2 голосов
/ 26 декабря 2011

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

Может быть, вы могли бы создать какую-то модель потока, в которой вы сохраните основную информацию о содержаниисообщений, так что вам нужно только просматривать темы.

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

Не следует использовать хранилище документов, например, базу данных sql.Может быть, лучше создать страницу форума непосредственно при создании / редактировании поста и сохранить все данные в документе, поэтому для его показа достаточно сделать один вызов read для mongo.

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