Node.js MongoDB Mongoose模式设计

Node.js MongoDB Mongoose模式设计,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我有一个模式设计问题。我有一个UserSchema和一个PostSchema var User = new Schema({ name: String }); var Post = new Schema({ user: { type: Schema.Types.ObjectId } }); 此外,用户还可以跟随其他用户。帖子可以被其他用户喜欢。 我想查询用户的追随者和用户的追随者,与猫鼬功能,如限制,跳过,排序等,我还想查询用户喜欢的帖子 基本上,我解决这个问题的唯一尝试是在每个模式

我有一个模式设计问题。我有一个UserSchema和一个PostSchema

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

var Post = new Schema({
 user: { type: Schema.Types.ObjectId } 
});
此外,用户还可以跟随其他用户。帖子可以被其他用户喜欢。 我想查询用户的追随者和用户的追随者,与猫鼬功能,如限制,跳过,排序等,我还想查询用户喜欢的帖子

基本上,我解决这个问题的唯一尝试是在每个模式中保持双重引用。模式变成了

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) { ... });

除了这样做双重引用之外,还有什么方法看起来容易出错吗?

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

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
  }
});

。。。检索跟踪您的用户。

是,我可以使用“填充”。但是,想象一下,如果我有很多用户。然后,如果我填充它,并将它们发送到前端,它将是大量的数据。我正在考虑更多关于如何实现分页/无限滚动的内容。你应该在最初的问题中说明这一点。如果你不指定你的需求,你就不能期待一个适合你需求的解决方案。也就是说,没有理由不使用上面的答案作为起点来实现分页/无限滚动解决方案。但是,如何实现这样的解决方案超出了您的问题范围。好的,很抱歉。如何使用您的解决方案实现分页?因为在标准查询中,我可以只执行限制和跳过,但是使用填充时,没有这样的选项。
.populate()
skip
limit
可用于实现分页的选项。我会更新我的答案。哦,太好了!这正是我需要的。
User.find({following: myId}).exec(function(err, users) { ... });