20354


現在ExpressとMongooseで jsonAPIを作成しております．  
2つのモデルを合成してsaveしたいです．

[code]

    // app/models/room.js
    
    var mongoose     = require('mongoose');
    var TmpSchema    = require('./tmp');
    var Schema       = mongoose.Schema;
    
    var RoomSchema   = new Schema({
        users: [TmpSchema],
        host_user: String
    });
    
    module.exports = mongoose.model('Room', RoomSchema);'
    
[/code]

こちらは子となるモデルです．

[code]

    // app/models/tmp.js
    
    var mongoose     = require('mongoose');
    var Schema       = mongoose.Schema;
    
    var TmpSchema = new Schema({
        user_id : String
    } , { _id: false});
    
    module.exports = mongoose.model('Tmp', TmpSchema);
    
[/code]

このような状態の時，POSTメソッドが呼び出された時にroomモデルのレコードを保存したいです．

[code]

    // server.js
    
    // call the packages we need
    var express    = require('express');        // call express
    var app        = express();                 // define our app using express
    var bodyParser = require('body-parser');
    
    // use MongoDB
    var mongoose   = require('mongoose');
    mongoose.connect('mongodb://localhost/edisonHTTPRequestAPI'); // connect to our database
    
    // use Model
    var User       = require('./app/models/user');
    var Room       = require('./app/models/room');
    var Tmp        = require('./app/models/tmp');
    
    ~~~~
    
    router.route('/rooms')
    
    // create a users (accessed at POST http://localhost:3000/api/rooms)
        .post(function(req, res) {
    
            var room = new Room();
            room.host_user = req.body.host_user;
            if(req.query.userID != null){
                var users = req.query.userID.split(" ");
                for(var i = 0;i<users.length;i++){
                    var tmp = new Tmp();
                    tmp.user_id = users[i];
                    tmp.save();
                    room.users[i] = tmp;
                }
            }
    
            room.save(function(err) {
                if (err)
                    res.send(err);
                console.log(room);
                res.json({ message: 'Room created!' });
            });
        })
    
[/code]

上記の様な記述を行いました．

そこで，例えば以下のようにPOSTメソッドを叩くと，意図したjsonが帰ってきます．  
[![](https://i.stack.imgur.com/VSo2t.png)](https://i.stack.imgur.com/VSo2t.png)

また，`server.js`内で，`console.log(room)`と行うと，ログも以下のように正常な値が帰ってきます．

[code]

    { __v: 0,
      host_user: 'test',
      _id: 5667de123b5a5caf9c000001,
      users: 
       [ { __v: 0, user_id: 'abc' },
         { __v: 0, user_id: 'def' },
         { __v: 0, user_id: 'ghi' } ] }
    
[/code]

しかし，このidを用いてsaveしたデータを確認すると，データの中にusersの要素が含まれていませんでした．

`$ curl http://localhost:3000/api/rooms/5667de123b5a5caf9c000001`

[code]

    //result
    {"_id":"5667de123b5a5caf9c000001","host_user":"test","__v":0,"users":[]}
    
[/code]

これは何が原因なのでしょうか…  
ご教授願います．


CC BY-SA 3.0
2015-12-09T08:26:23.367
19798
2015-12-25T06:59:55.453
9996
question
javascript node.js mongodb
Mongoose + express でネストされたスキーマモデルをsaveしたい．


ネストされたスキーマモデル（embedded document）が更新されない場合、多分 `markModified` を忘れているんじゃないかな。

`room.save()` を実行する前に `room.markModified('users');` と入れてみたらどうでしょう？

これを入れてもダメなら `Schema.options.toJSON` あたりを調べてみるのが、吉と思われ。


CC BY-SA 3.0
2015-12-25T06:59:55.453
20354
2015-12-25T06:59:55.453
9199
19798
answer