[英]MongoDB Mongoose schema design
我有一個架構設計問題。 我有一個UserSchema和一個PostSchema。
var User = new Schema({
name: String
});
var Post = new Schema({
user: { type: Schema.Types.ObjectId }
});
此外,用戶可以關注其他用戶。 帖子可以被其他用戶喜歡。 我想查詢用戶的關注者和用戶的關注,使用mongoose功能,如限制,跳過,排序等。我還想查詢用戶喜歡的帖子。
基本上,我唯一的解決方法就是在每個模式中保持雙重引用。 模式成為
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) { ... });
...檢索關注您的用戶。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.