2017-03-26 97 views
0

我知道填充模式並不是一個新問題,但是我對遵循多重模式的邏輯有點麻煩。我正在與使用addToSet在嵌套模式貓鼬內添加項目

"mongoose": "^4.8.5", 
"express": "^4.15.0", 

我有一個模式與咖啡因飲料的集合。當用戶選擇飲品時,我想將該飲品分配給使用者。

**如果在任何時候我錯過了一些簡單的架構,請讓我知道。這個項目是我對mongodb的介紹。

我正在閱讀通過填寫貓鼬文檔http://mongoosejs.com/docs/populate.html

本質上,如果我要將飲料分配到列表中,它看起來像我想將它們作爲參考添加到數組中。這是我與caffeine_list

const SelectedDrinks = require('./userDrinks'); 

const UserSchema = mongoose.Schema({ 
    name: { 
    type: String 
    }, 
    email: { 
    type: String, 
    required: true 
    }, 
    username: { 
    type: String, 
    required: true 
    }, 
    password: { 
    type: String, 
    required: true 
    }, 
    caffeine_list: caffeine_list: [ // attempting to reference selected drinks 
    { 
     type: mongoose.Schema.Types.ObjectId, 
     ref: 'SelectedDrinks' 
    } 
] 

})

SelectedDrinks來自下面的架構方法。我添加到用戶的引用作爲創建者下面

const User = require('./user'); 

let userDrinkSchema = new mongoose.Schema({ 
     creator : { 
     type: mongoose.Schema.Types.ObjectId, 
     ref: 'User' 
     }, 
     caffeine: Number, 
     mgFloz: Number, 
     name: String, 
     size: Number, 
     updated_at: { 
     type: Date, 
     default: Date.now() 
    } 
}); 

這是我開始感到困惑。我最初嘗試填充,但無法完成。如果這是正確的,請讓我知道。

關於我向用戶添加選定飲品的任務,我使用了addToSet。我希望這會給我飲料信息。我做了這樣的設置...

const User = require('../../models/user'); 
const UserDrinks = require('../../models/userDrinks'); 


router.post('/addDrink', (req, res, next) => { 
    let newDrink = new UserDrinks({ 
     creator: req.body.creator, 
     caffeine: req.body.caffeine, 
     mgFloz: req.body.mgFloz, 
     name: req.body.name, 
     size: req.body.size, 
     updated_at: req.body.updated_at 
    }); 

newDrink.save((err) => { 
    if(err) { 
     res.send(err); 
    } else { 
     User.findOne({ _id: newDrink.creator}, (err, user) => { 
      user.caffeine_list.addToSet(newDrink) 
      user.save(function (err) { 
       if(err) { 
        console.log(err); 
       }else { 
        res.status(201).json(newDrink); 
       } 
      }) 
     }) 
    } 

}) 

});

然而,當我在郵遞員做了後我檢查caffeine_list,其結果是

"caffeine_list" : [ 
    ObjectId("58d82a5ff2f85e3f21822ab5"), 
    ObjectId("58d82c15bfdaf03f853f3864") 
], 

理想我想有正有像這樣

咖啡因信息傳遞的對象數組
"caffeine_list" : [ 
    { 
     "creator": "58d6245cc02b0a0e6db8d257", 
     "caffeine": 412, 
     "mgFloz": 218.7, 
     "name": "1.95 Perfect Drink!", 
     "size": 42.93, 
     "updated_at": "2017-03-24T18:04:06.357Z" 
    } 
] 
+0

最後一個部件不能正確的。您的POST處理程序僅返回作爲對象的新添加的飲料。具體在你的問題上。你在努力完成什麼? – Mikey

+1

我正試圖完成我在userSchema的caffeine_list數組中注意到的內容。我正在嘗試向帖子內的userSchema添加飲料。我能夠在mongo和caffeine_list數組中找到userId。問題是我添加了對象ID。而不是newDrink。 – Winnemucca

回答

0

儘管我不確定這是否是最好的方法,但我確實發現這是給我我期望的結果。我不得不做出兩個小的變化,我能得到caffeine_list給我所需的響應

我不得不訪問架構選擇的飲料

const SelectedDrinks = require('./userDrinks').schema; //** need schema 

後來我才得以改觀

caffeine_list: [ 
    { 
     type: mongoose.Schema.Types.ObjectId, 
     ref: 'UserDrinks' // name of the file 
    } 
] 

caffeine_list: [SelectedDrinks] 

現在我已經可以將飲品直接添加到UserSchema的caffeine_list中。

1

與更改其他部分下面的代碼,而不是findOne和保存使用更新

 User.update(
    { _id: newDrink.creator},    
    { $addToSet:{ 
     caffeine_list: newDrink 
    }}).exec(function (err, updatedrink){ 

    if(err) { 
     console.log(err); 
    }else { 
     res.status(201).json(updatedrink); 
    } 

})