1

ユーザーが新しいドキュメントを作成した後、ドキュメント _id を別のスキーマの配列に保存したいと考えています。要するに、ユーザーがビデオの URL を保存し、ビデオのドキュメント _id をユーザー スキーマの配列に保存したいと考えています。これを行う方法を理解するのに苦労しています。ここに私のモデルファイルがあります:

ビデオ.js:

// Video Model
// -------------

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

// Embedded document schema
var NotesSchema = new Schema({
    timecode  : String,
    text      : String
});

// Main schema
var VideoSchema = new Schema({
    title   : String,
    url_id  : String,
    notes   : [NotesSchema]
});

module.exports = mongoose.model('Note', NotesSchema);
module.exports = mongoose.model('Video', VideoSchema);

アカウント.js:

// Account Model
// -------------

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var Video = require('../models/videos.js');
var passportLocalMongoose = require('../node_modules/passport-local-mongoose/lib/passport-local-mongoose.js');

var AccountSchema = new Schema({
    username: String,
    salt: { type: String, required: true },
    hash: { type: String, required: true },
    videos: [VideoSchema]  // <- need to save here
});

AccountSchema.plugin(passportLocalMongoose);

module.exports = mongoose.model('Account', AccountSchema);

ドキュメントを作成して MongoDB に保存するためのコードを現在どのように設定しているかを次に示します。

var video = new Video({
    title   : req.body.title,
    url_id  : req.body.url_id
});

video.save(function(err) {
    if (err) {
        console.log(err);
    } else {
        res.redirect('videos/' + video._id);
        console.log('video saved.');
        console.log('video information: ' + video);
    }
});

基本的に、ビデオに保存する方法がわかりません。ビデオ ドキュメント _id のみをアカウント スキーマの配列に送信します。どうすればいいですか?

編集:

提案された修正を実装したにもかかわらずdata._id、Account スキーマ内の配列に保存されていません。エラーはスローされません。mongo CLI を使用してアカウントを確認すると、配列が空です。

ここに私の現在の変更があります:

video.js

// Video Model
// -------------

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

var NotesSchema = new Schema({
  timecode  : String,
  text      : String
});

var VideoSchema = new Schema({
  title   : String,
  url_id  : String,
  notes   : [NotesSchema]
});

module.exports = mongoose.model('Note', NotesSchema);
module.exports = mongoose.model('Video', VideoSchema);

account.js

// Account Model
// -------------

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var Video = require('../models/videos');
var passportLocalMongoose = require('../node_modules/passport-local-mongoose/lib/passport-local-mongoose.js');

var AccountSchema = new Schema({
    nickname: String,
    birthday: Date,
    videos: [{ type: Schema.Types.ObjectId, ref: 'Video' }]
});

AccountSchema.plugin(passportLocalMongoose);

module.exports = mongoose.model('Account', AccountSchema);

video-route.js

var util = require('util');
var mongoose = require('mongoose');
var Video = require('../models/videos');
var Account = require('../models/account');

var video = new Video({
  title   : req.body.title,
  url_id  : goodVimeoId
});

video.save(function(err, data) {
  if (err) {
    console.log(err);
  } else {
    Account.findOne({username : req.user.username}, function(err, result) {
      result.videos.push(video._id);
      res.redirect('videos/' + video._id);
    });

  }
});

動画データがアカウントに保存されない理由について何か提案はありますか? 再度、感謝します。

4

2 に答える 2

1

ObjectIdに関するコメントに気づきました。必要に応じて回答を更新しました:

  var ObjectId = Schema.ObjectId;

  var AccountSchema = new Schema({
        username: String,
        salt: { type: String, required: true },
        hash: { type: String, required: true },
        videos: [{type: ObjectId, ref: 'Video'}]  // <- need to save here
  });
 ....
 ....

  video.save(function(err, data)    {
     Account.findOne({username:req.body.username}, function(err, result)    {
         result.videos.push(data._id);
     });
  });
于 2013-03-12T03:21:34.950 に答える
0

問題が解決しました:

次のようにresult.save();afterを追加する必要があります。result.videos.push(video._id);

    Account.findOne({username : req.user.username}, function(err, result) {
      result.videos.push(video._id);
      result.save();
      res.redirect('videos/' + video._id);
    });
于 2013-03-16T20:11:10.827 に答える