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) { ... });
…检索关注您的用户。