MongoDB Mongoose模式devise

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

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

而且,用户可以跟随其他用户。 post可以被其他用户喜欢。 我想查询用户的追随者和用户的以下,与mongoosefunction,如限制,跳过,sorting等,我也想查询后,用户喜欢。

基本上,我唯一的解决这个问题的方法是在每个模式中保持双引用。 模式成为

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

除了像这样看起来容易出错的双引用之外,还有其他的方法吗?

实际上,你不需要双引用。 假设您保留following参考。

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

…检索关注您的用户。