2017-02-08 119 views
1

我是MongoDB的新手,我正在用Mongoose創建一個簡單的數據庫,並使用以下模型:用戶,遊戲和玩家。MongoDB Mongoose保存具有嵌套對象的對象

因此,一個用戶不包含任何或許多遊戲。每場比賽都有球員,而每名球員都是指用戶。像這樣(我爲了清楚而簡化的模式):

const UserSchema = new Schema({ 
    name: String, 
    games: [{ 
    type: Schema.Types.ObjectId, 
    ref: 'game' 
    }] 
}); 

const GameSchema = new Schema({ 
    mode: Number, 
    players: { 
    type: [{ 
     type: Schema.Types.ObjectId, 
     ref: 'player' 
    }], 
    required: true 
    } 
}); 

const PlayerSchema = new Schema({ 
    order: Number, 
    isWinner: Boolean, 
    user: { 
    type: Schema.Types.ObjectId, 
    ref: 'user', 
    required: true 
    } 
}); 

所以,現在在前臺我要了一份請願書發送到後端來創建一個新的遊戲,爲用戶喬(_id:11111)和Bob(_id :22222),所以我發送POST到/ api /遊戲與身體{ users: [ 11111, 22222 ] }

現在我的問題是,爲後端創建一個新的遊戲,它也必須創建2名球員。達到此目的的最佳方式是什麼?

在Game.create()方法中,我應該檢索數據,創建並保存玩家,創建遊戲,分配玩家,保存遊戲以及更新用戶並添加遊戲id。

我還閱讀了關於Mongoose中間件,您可以在其中設置某些功能在某些操作之前或之後執行。所以也許它會更好: 在Game.create之前的預先功能,在Game.create之前創建球員 之後的功能,以更新用戶

最後一個看起來更乾淨。 最好的方法是什麼?也許另一個我沒有考慮過?

謝謝

回答

1

我建議你使用貓鼬中間件中定義的post和pre函數。他們非常簡單明瞭,使用起來很簡單。它可能會解決你的問題。

下面是我們遇到的問題的個人示例;在我們的例子中,我們必須從數據庫中的一個序列中分配一個userId。我們用下面的代碼:

var UserSchema = new Schema({ 
username: { type: String, required: true, unique: true }, 
id: { type: String }, 
... 
}); 

UserSchema.pre('save', function(next) { 
    let doc = this;  
    let id = 'userSeq'  

Sequence.findByIdAndUpdate(id, { $inc : {nextSId : 1} }, function(error,data) {   
    if(error) 
     next(error)    
    doc.id = data.nextSId-1; 
    next(); 
    })   
}); 

我的建議是,你創建的比賽前,你可以搜索用戶,並添加一個引用到遊戲中。如果我是你,我會使用mongodb的findAndModify查詢來查找用戶或創建它們,如果它們還不存在。