在 mongodb 中加入类似查询

Posted

技术标签:

【中文标题】在 mongodb 中加入类似查询【英文标题】:Join like query in mongodb 【发布时间】:2012-01-14 17:15:54 【问题描述】:

我有一个要求,我需要获得用户的朋友。我制作了两个名为 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);
);

如何加入这两个查询以获得所需的结果。请帮助

【问题讨论】:

我认为这更多是您的数据库设计问题,而不是如何查询这个问题...将朋友作为 ID 数组添加到用户模式。然后查询用户(并获取数组),然后获取所有朋友用户(***.com/questions/5818303/…)。 pkyeck 是对的,您应该向用户添加好友数组,因为这样您只需要执行一个查询 => 优化 是的,它是这样工作的。如果我使用循环,渲染文件时会出现问题。使用数组消除了这一点。谢谢 【参考方案1】:

我建议您尝试对数据进行非规范化,而不是沿着 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);

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

【讨论】:

以上是关于在 mongodb 中加入类似查询的主要内容,如果未能解决你的问题,请参考以下文章

在烧瓶 mongoDB 中加入集合的 groupby 查询

在查询输出中加入字符串

使用 mongoose 在 mongodb 中加入集合

除了 $lookup 运算符之外,MongoDB 4.0 中加入的替代方法是啥,因为它不适用于分片集合

mongodb通过ID查询为空

MongoDB压缩版安装