Node.js MongoDB Mongoose模式设计
我有一个模式设计问题。我有一个UserSchema和一个PostSchemaNode.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 } }); 此外,用户还可以跟随其他用户。帖子可以被其他用户喜欢。 我想查询用户的追随者和用户的追随者,与猫鼬功能,如限制,跳过,排序等,我还想查询用户喜欢的帖子 基本上,我解决这个问题的唯一尝试是在每个模式
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) { ... });