Присоединиться как запрос в mongodb - PullRequest
2 голосов
/ 07 декабря 2011

У меня есть требование, где я должен получить друзей пользователя. Я сделал две коллекции под названием Пользователь и Друзья. Код, который я использую для доступа к данным от Друзей и Пользователя:

var friend = Friends.find({acceptor:req.currentUser.id,status:'0'},function(err, friends) {
    console.log('----------------friends-----------------'+friends.length);

  });

console.log дает мне желаемые результаты для друзей. Теперь, если я использую друга для доступа к данным пользователя, таким как данные, я не получаю нужный мне результат.

var user = User.find({_id:friend.requestor},function(err, users) { 
     console.log('----------------user-----------------'+users.length);
});

как я могу объединить два запроса, чтобы получить желаемый результат. Пожалуйста, помогите

1 Ответ

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

Я бы посоветовал вам попытаться денормализовать данные, а не идти по пути SQL:

User {
  "FirstName" : "Jack",
  "LastName" : "Doe",
  // ...
  // no friend info here
}

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

FriendList {
  OwnerUserId : ObjectId("..."),
  FriendUserId : ObjectId("..."),
  FriendName: "Jack Doe"
  // add more denormalized information
}

Теперь, чтобы отобразить список друзей пользователя:

var friends = db.FriendList.find({"OwnerUserId" : currentUserId});

Недостатком является то, что, если подруга меняет свое имя, вам придется обновить все ссылки на это имя. С другой стороны, эта логика тривиальна, и что (как правило, гораздо более распространенный) запрос «извлекать всех друзей» является очень быстрым, простым в написании и простым в обращении.

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