2017-09-04 4 views
0

私はmongoose 4.11.10を使用して、私は2つのモデルを宣言しました:User & Task。私のユーザモデルは次のとおりです。フォームの補完で使用する

let UserSchema = mongoose.Schema({ 
    name: { 
    type: String, 
    required: true, 
    minlength: 1, 
    maxlength: 15 
    } 
}); 
let User = mongoose.model("UserModel", UserSchema); 

Userモデルからのフラグメント:

let TaskSchema = mongoose.Schema({ 
    userName: { 
    type: mongoose.Schema.ObjectId, 
    ref: "User", 
    required: false, 
    minlength: [1, "Invalid name"], 
    maxlength: [15, "Too big name"] 
    } 
}); 
let Task = mongoose.model("TaskModel", TaskSchema); 

I'veはフォームを、持ってどこで入力すべてのこれらの値:サーバー側で

<p>Add new task: </p> 
<form action="/api/tasks/" method="post"> 
    Name: 
    <input type="text" name="name"> 
    <br> 
    Definition: 
    <input type="text" name="definition"> 
    <br> 
    Status: 
    <input type="text" name="status"> 
    <br> 
    Responsible user: 
    <input type="text" name="userName"> 
    <br> 
    Deadline: 
    <input type="date" name="deadline" > 
    <br><br> 
    <input type="submit" value="SEND"> 
</form> 

私はコントローラを持っている:

api.post("/tasks/", (req, res) => { 
    let name = req.body.name; 
    let definition = req.body.definition; 
    let status = req.body.status; 
    let userName = req.body.userName; 
    let deadline = req.body.deadline; 
    if (userName.length < 1) { 
    Task.create({name: name}, {definition: definition}, {status: status}, {userName: "not delegated yet"}, {deadline: deadline}) 
     .then(() => { 
     console.log("Insertion successful"); 
     res.redirect("/api/tasks"); 
     }) 
     .catch(err => { 
     console.log("Cannot insert"); 
     throw err; 
     }) 
    } else { 
    Task.create({name: name}, {definition: definition}, {status: status}, {userName: userName}, {deadline: deadline}) 
     .then(() => Task.findOne({name: name}).populate("userName")) 
     .then(() => { 
     console.log("Insertion successful"); 
     res.redirect("/api/tasks"); 
     }) 
     .catch(err => { 
     console.log("Cannot insert"); 
     throw err; 
     }) 
    } 
}); 

私は2つのスキーマをリンクしたい:私は指定されたユーザーのタスクを "委任"したいが、現在は()マングースメソッドが動作しない:(どうすればその問題を解決できますか?

ご協力いただければ幸いです!

答えて

0

は、私は、これはあなたがObjectIdとしてuserNameのタイプを定義したが、nameのタイプがStringであるあなたにhttps://stackoverflow.com/questions/14730676/linking-2-mongoose-schemas

+0

nope :(この質問も未解決です –

0

を助けるかもしれない、同様の質問を見つけました。それは不一致であり、人口は機能しません。

Stringにタイプを変更してください。

let TaskSchema = mongoose.Schema({ 
    user: { 
     type: String, 
     ref: 'User', 
     required: false, 
     minlength: [1, "Invalid name"], 
     maxlength: [15, "Too big name"] 
    } 
}); 

私は、あなたが自分のスキーマにtasks配列を追加することなく、特定のユーザーのすべてのタスクを取得しようとしている場合は、

Task.findOne(...).populate('user').exec(function (err, task) { 
    console.log(task.user.name); 
}); 

を照会するとき、あなたがより多くの明快さを加えるために useruserNameの名前を変更示唆しますあなたは virtual population

UserSchema.virtual('tasks', { 
    ref: 'Task', // The model to use 
    localField: 'name', // Find task where `localField` 
    foreignField: 'user' // is equal to `foreignField` 
}); 

を使用することができますそして、あなたはその後、

を行うことができます
User.findOne(...).populate('tasks').exec(function (err, user) { 
    console.log(user.tasks); 
});