像mongodb中的查询一样加入

时间:2011-12-07 06:16:09

标签: mongodb node.js express mongoose

我有一个要求,我需要得到用户的朋友。我创建了两个名为User和Friends的集合。 我用来访问好友和用户数据的代码是:

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 个答案:

答案 0 :(得分:3)

我建议您尝试对数据进行非规范化,而不是沿着SQL路径:

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

将非规范化信息放入朋友列表中。不要使用嵌入式阵列,因为每次获取用户时,您可能不需要获取所有朋友ID。数据结构的细节取决于您想要支持的关系(定向与非定向等),但它大致如下所示:

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

现在,要显示用户的朋友列表:

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

缺点是,如果朋友更改了她的名字,您将不得不更新该名称的所有引用。另一方面,这种逻辑是微不足道的,并且(通常更常见的)查询“获取所有朋友”是超级快速,易于编码和易于分页。