2015-10-18 60 views
1

目前我在看mongoDB。我嘗試使用的NodeJS和貓鼬來實現一個簡單的一對多關係:MongoDB中的一對多關係

模式/模式用戶:

var mongoose = require('mongoose'), 
    Schema = mongoose.Schema; 

var UserSchema = new Schema({ 
    name: String 
}); 

module.exports = mongoose.model('User', UserSchema); 

模型/方案文章:

var mongoose = require('mongoose'), 
    Schema = mongoose.Schema; 

    var ArticleSchema = new Schema({ 
     name: { 
      type: String, 
      required: true 
     }, 
     user: { 
      type: Schema.ObjectId, 
      ref: 'User' 
     } 
    }); 

    module.exports = mongoose.model('Article', ArticleSchema); 

所以我的問題,現在: 我如何獲得包括其文章在內的所有用戶? 我真的不得不向我的UserScheme添加一個ref嗎?像這樣的一對多關係中的最佳實踐是什麼?有沒有像MongoDB中的連接?

一個用戶有很多文章 - 一篇文章屬於一個用戶。 調用/ user /:user_id之類的東西,我想接收包含他所有文章的_id = user_id的用戶。

回答

1

由於各種原因,這是最可怕的想法。

首先,有一個16MB的BSON文件大小限制。您根本無法將更多內容放入文檔中。嵌入文檔相當適合「一對多(很少)」的關係,而非「一對多」關係。

至於用例:你在這裏有什麼問題?它是

對於給定的用戶,什麼是文章?

REST明智的,你應該只返回物品時/users/:id/articles是GETed和文章(也是唯一的文章)應返回一個JSON陣列。

所以,你的模型看起來很自然。至於用戶:

{ 
    _id: theObjectId, 
    username: someString 
    … 
} 

和文章應該是這樣的:

{ 
    _id: articleIdOrSlugOrWhatever, 
    authors: [theObjectId], 
    // or author: theObjectId 
    retention: someISODate, 
    published: someOtherISODate 
} 

所以,當你的REST服務要求/users/:id你只需仰望

var user = db.users.findOne({_id:id}) 

而且當調用/users/:id/articles時,您會查找到

var articles = db.articles.find({author:id}) 

問題以可擴展的方式解決,遵循REST原則。