2015-07-21 107 views
0

全部。貓鼬不填充先前保存的文檔參照新保存的文檔

我正在編寫一個MEAN棧應用程序,使用Mongoose(4.0.6)和Node/Express來與MongoDB接口,並且當我保存新文檔時,現有文檔應該有一個保存文檔參考。具體來說,在應用程序中,我有一個用戶在爲該公司創建其管理員帳戶之前創建了一個公司實例,因此當用戶註冊爲管理員時,我希望公司文檔使用新用戶。

這裏是我的公司和用戶模式:

user.js的...

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 
var ObjectId = Schema.Types.ObjectId; 

var userSchema = new Schema({ 
    first_name:  { type: String, required: '{PATH} is required!' }, 
    last_name:  { type: String, required: '{PATH} is required!' }, 
    username:  { type: String, required: '{PATH} is required!', lowercase: true, unique: true }, 
    password:  { type: String, required: '{PATH} is required!' }, 
    roles:   { type: [String] }, 
    company:   { type: ObjectId, ref: 'Company', required: true }, 
    db_permissions: [{ type: ObjectId, ref: 'DataConnection' }], 
    created_by:  { type: ObjectId, ref: 'User' }, 
    created_at:  { type: Date, default: Date.now }, 
    updated_at:  [{ type: Date, default: Date.now }] 
}); 

var User = mongoose.model('User', userSchema); 

module.exports = { 
    User: User 
}; 

Company.js ...

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 
var ObjectId = Schema.Types.ObjectId; 

var companySchema = new Schema({ 
    name:    { type: String, uppercase: true, required: '{PATH} is required!', unique: true }, 
    industry:   { type: String, required: '{PATH} is required!' }, 
    phone:    { type: String, required: '{PATH} is required!' }, 
    address_line_1: { type: String, uppercase: true, required: '{PATH} is required!' }, 
    address_line_2: { type: String, uppercase: true }, 
    city:    { type: String, uppercase: true, required: '{PATH} is required!' }, 
    state_prov:  { type: String, uppercase: true, required: '{PATH} is required!' }, 
    postal_code:  { type: String, required: '{PATH} is required!' }, 
    country:   { type: String, required: '{PATH} is required!' }, 
    logo_url:   String, 
    users:   [{ type: ObjectId, ref: 'User' }], 
    data_connections: [{ type: ObjectId, ref: 'DataConnection' }], 
    created_at:  { type: Date, default: Date.now }, 
    updated_at:  [{ type: Date, default: Date.now }] 
}); 

var Company = mongoose.model('Company', companySchema); 

module.exports = { 
    Company: Company 
}; 

這裏是我的控制器代碼:

User.create(userData, function(err, user) { 
    if(err) { 
    if(err.toString().indexOf('E11000') > -1) { 
     err = new Error('Duplicate email'); 
    } 
    res.status(400); 
    return res.send({ reason:err.toString() }); 
    } 
    console.log('company id: ' + user.company); 
    Company.findById(user.company) 
    .populate({path: 'users'}) 
    .exec(function (err, company) { 
     if (err) return handleError(err); 
     console.log(company.name + '\'s users now includes ' + company.users); 
    }); 
    res.send(user); 

該公司y(例如TEST53)保存到數據庫中正確使用空用戶陣列:

{ 
    "_id": "55ae421bf469f1b97bb52d5a", 
    "name": "TEST53", 
    "industry": "Construction", 
    "phone": "2352626254", 
    "city": "GDFGD", 
    "country": "United States", 
    "address_line_1": "DSGDFGH", 
    "state_prov": "GF", 
    "postal_code": "45645", 
    "logo_url": "", 
    "__v": 0, 
    "updated_at": [ 
     "2015-07-21T12:59:07.609Z" 
    ], 
    "created_at": "2015-07-21T12:59:07.597Z", 
    "data_connections": [], 
    "users": [] 
} 

然後,當我創建的用戶,它可以正確保存:

{ 
    "_id": "55ae4238f469f1b97bb52d5b", 
    "username": "[email protected]", 
    "password": "$2a$12$ZB6L1NCZEhLfjs99yUUNNOQEknyQmX6nP2BxBvo1uZGlvk9LlKGFu", 
    "company": "55ae421bf469f1b97bb52d5a", 
    "first_name": "Test53", 
    "last_name": "Admin", 
    "__v": 0, 
    "updated_at": [ 
     "2015-07-21T12:59:36.925Z" 
    ], 
    "created_at": "2015-07-21T12:59:36.550Z", 
    "db_permissions": [], 
    "roles": [ 
     "admin" 
    ] 
} 

而且我可以看到正確的ObjectId打印到控制檯對於user.company:

company id: 55ae421bf469f1b97bb52d5a 

但該公司的用戶數組不與用戶的ID進行填充,而.exec函數打印內的console.log「TEST53的用戶現在包括」。

我已經嘗試了幾種方式將它連接起來,只用'users'而不是{path:'users'},編寫一個將用戶推入數組的函數,但使用.run而不是.exec遠未成功。

有什麼明顯的我失蹤了嗎?在此先感謝您的任何建議!

回答

1

你實際上並沒有將用戶添加到公司。

試試這個:

Company.findById(user.company, function (err, company) { 
    if (err) return handleError(err); 

    // Add the user to the company's list of users. 
    company.users.push(user); 

    // Need to save again. 
    company.save(function(err) { 
    if (err) return handleError(err); 
    console.log(company.name + '\'s users now includes ' + company.users); 
    }); 
}); 
res.send(user); 

在我看來,所有你想要做的是更新Company模型添加的用戶,而不是實際使用(居住)Company文件作爲響應,所以我省了一個額外的Company.findById(...).populate(...)電話。

+0

是的,這樣做!非常感謝。這是我第一次感受通過堆棧中所有不同技術的方式,所以我非常欣賞這個指導。 –