2015-09-24 8 views
12

に子ドキュメントを追加する基本的に私は、次のスキーマを持っている私の既存のMongoDBのドキュメントは、既存のMongoDBのドキュメント

/models/server/destination.js

に新しいサブ文書を追加しようとしています
// this is the "destination" model for mongoose 
var mongoose = require('mongoose') 
var Adventure = require('../models/adventure') 

// this is the schema that every entry will get when a new trip is made. 
var tripSchema = mongoose.Schema({ 
    name: { type: String, required: true }, 
    city: { type: String, required: true }, 
    dateStart: { type: Date, required: true }, 
    dateFinish: { type: Date, required: true }, 
    adventures: [Adventure] 
}) 

// module.exports makes this model available to other file 
module.exports = mongoose.model('Destination', tripSchema) 

/server/models/adventure.js

var mongoose = require('mongoose') 

var adventure = mongoose.Schema({ 
    site: String, 
    rating: String, 
    photo: String, 
    website: String, 
    date: Date 
}) 

module.exports = mongoose.model('Adventure', adventure) 

RESTの、私はコードが壊れていないdestination.adventures.push()の外に冒険を取るときに冒険

app.post('/api/destinations/:id/addAdventures', destinationsController.addAdventures) 

/server/controllers/controller.js

module.exports.addAdventures = function(req, res) { 
    var id = req.params.id; 
    Destination.findOne({ _id: id }, function(err, result) { 
     var adventure = new Adventure(req.body) 
     var destination = result 
     destination.adventures.push(adventure) 
     destination.save(function(err, advresult) { 
      console.log('push worked') 
      res.json(advresult); 
     }) 
    }) 
} 

に投稿するルートが、ときに私冒険を挿入するエラーが発生します

/Travellog/node_modules/mongoose/lib/types/array.js:117 
    return this._schema.caster.cast(value, this._parent, false); 
          ^TypeError: undefined is not a function 
    at Array.MongooseArray.mixin._cast (/Travellog/node_modules/mongoose/lib/types/array.js:117:32) 
    at Array.MongooseArray.mixin._mapCast (/Travellog/node_modules/mongoose/lib/types/array.js:286:17) 
    at Object.map (native) 
    at Array.MongooseArray.mixin.push (/Travellog/node_modules/mongoose/lib/types/array.js:299:25) 
    at Query.<anonymous> (/Travellog/server/controllers/destinations-controller.js:28:28) 
    at /Travellog/node_modules/mongoose/node_modules/kareem/index.js:177:19 
    at /Travellog/node_modules/mongoose/node_modules/kareem/index.js:109:16 
    at process._tickCallback (node.js:355:11) 

答えて

29

エラーは結果として発生していますスキーマの代わりにAdventureモデルを埋め込むあなたは先のスキーマ定義にAdventureモデルのスキーマプロパティをAdventureスキーマを追加する必要があります。

// this is the "destination" model for mongoose 
var mongoose = require('mongoose'); 
var AdventureSchema = require('../models/adventure').schema; /* <- access the schema via its Model.schema property */ 

var tripSchema = mongoose.Schema({ 
    name: { type: String, required: true }, 
    city: { type: String, required: true }, 
    dateStart: { type: Date, required: true }, 
    dateFinish: { type: Date, required: true }, 
    adventures: [AdventureSchema] 
}); 
+2

すごいです!それは完璧に働いた、あなたは永遠にそれに立ち往生していただきありがとうございます。私はMongooseの文書に従っていましたが、それはこれが本当に正しいnode.jsと関係がありますか? – pwborodich

+2

ありがとうございます。私も同じ問題がありました。 – FarheenP

+2

ありがとうございます。スキーマを別のファイルに分割しようとしましたが、誤ってモデルなどを含むことになりました。 5時間後。 –

関連する問題