MongoDB Mongoose架构设计

4

我有一个架构设计问题。我有一个UserSchema和一个PostSchema。

var User = new Schema({
  name: String
});

var Post = new Schema({
 user: { type: Schema.Types.ObjectId } 
});

此外,用户可以关注其他用户。帖子可以被其他用户点赞。我想使用Mongoose的功能(例如limit、skip、sort等)查询用户的关注者和用户正在关注的人。我还想查询用户喜欢的帖子。
基本上,我解决这个问题的唯一尝试是在每个模式中保留双重引用。模式变成了:
var User = new Schema({
  name: String,
  followers: [{ type: Schema.Types.ObjectId, ref: "User" }],
  following: [{ type: Schema.Types.ObjectId, ref: "User" }]
});

var Post = new Schema({
 creator: { type: Schema.Types.ObjectId, ref: "User" },
 userLikes: [{ type: Schema.Types.ObjectId, ref: "User" }]
});

因此,将用于查询的代码如下:

// Find posts that I create
Post.find({creator: myId}, function(err, post) { ... });

// Find posts that I like
Post.find({userLikes: myId}, function(err, post) { ... });

// Find users that I follow
User.find({followers: myId}, function(err, user) { ... });

// Find users that follow me
User.find({following: myId}, function(err, user) { ... });

有没有其他方法可以避免这种容易出错的双重引用方式?
1个回答

4

实际上,您不需要双重引用。我们假设您保留以下引用。

var User = new Schema({
  name: String,
  following: [{ type: Schema.Types.ObjectId, ref: "User" }]
});

你可以使用 .populate() 获取你正在关注的用户:

编辑:添加了跳过/限制选项以展示分页示例

User.findById(myId).populate({ path:'following', options: { skip: 20, limit: 10 } }).exec(function(err, user) {
  if (err) {
    // handle err
  }
  if (user) {
     // user.following[] <-- contains a populated array of users you're following
  }
});

而且,正如你已经提到的那样...
User.find({following: myId}).exec(function(err, users) { ... });

...检索正在关注您的用户。


我可以使用populate。但是,想象一下如果我有很多用户,那么如果我填充它并将其发送到前端,那将是大量的数据。我正在考虑更多如何实现分页/无限滚动。 - Christian Sakai
你应该在最初的问题中说明这一点。如果没有明确你的需求,你就不能期望得到符合需求的解决方案。话虽如此,以上回答作为你的起点,你仍然可以实现分页/无限滚动的解决方案。但如何实现这样的解决方案超出了你提问的范围。 - JME
好的,对不起。我该如何使用你的解决方案实现分页呢?因为在标准查询中,我只需要使用limit和skip,但是在populate中却没有这样的选项。 - Christian Sakai
.populate()skiplimit选项,您可以使用它们来实现分页。我会更新我的答案。 - JME
哦,太好了!这正是我需要的。 - Christian Sakai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接