簡體   English   中英

MongoDB Mongoose架構設計

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM