web-dev-qa-db-ja.com

Mongooseを使用したObjectIdによるMongoDBドキュメントの検索

ObjectIdでドキュメントを見つけて、MongoDBのドキュメントを更新しようとしています。ワークフローは以下のとおりです(ブログ用)。

  1. タイトルと本文を渡して、MongoDBに新しい投稿を作成します。 ObjectIdは自動的に作成されます。
  2. 投稿の編集に移動します。 URLのObjectIdを使用してデータベースから取得し、既存の値だけを使用して同じ新しい投稿フォームに表示します。
  3. 送信ボタンがクリックされたら、ObjectIdでドキュメントを検索し、データベースの値を投稿フォームの値で更新します。

手順1と2は正常に機能しますが、手順3は機能していないようです。必要なページにリダイレクトされます。しかし、データベースは更新されていません。以前と同じ値です。

更新投稿部分に関連するコードは次のとおりです。

app.js

app.post "/office/post/:id/update", ensureAuthenticated, routes.updatePost

routes/index.js

mongoose = require 'mongoose'
ObjectId = mongoose.Types.ObjectId

Post = require '../models/Post'

...

updatePost: function(req, res) {
  var o_id, the_id;

  the_id = req.params.id;
  console.log(the_id); // 510e05114e2fd6ce61000001

  o_id = ObjectId.fromString(the_id);
  console.log(o_id); // 510e05114e2fd6ce61000001

  return Post.update({
    "_id": ObjectId.fromString(the_id)
  }, {
    "title": "CHANGE"
  }, res.redirect("/office/edit/posts"));
}

ExpressとMongooseを使用しています。

それが役立つ場合、これはポストモデルでもあります。

(function() {
  var Post, Schema, mongoose;

  mongoose = require('mongoose');

  Schema = mongoose.Schema;

  Post = new Schema({
    title: String,
    subhead: String,
    body: String,
    publish_date: {
      type: Date,
      "default": Date.now
    },
    mod_date: {
      type: Date,
      "default": Date.now
    }
  });

  module.exports = mongoose.model('Post', Post);

}).call(this);

そして、ブログ投稿の編集ビューのコードは次のとおりです。

app.js

app.get("/office/post/:id/edit", ensureAuthenticated, routes.editPost);

routes/index.js

editPost: function(req, res) {
  return Post.findById(req.params.id, function(err, post) {
    return res.render('edit-post', {
      post: post,
      title: post.title
    });
  });
}
8
David Yeiser

問題は、updateをどのように呼び出すかです。

return Post.update({
    "_id": ObjectId.fromString(the_id)
}, {
    "title": "CHANGE"
}, res.redirect("/office/edit/posts"));

最後の引数は実際にはページをリダイレクトしますが、updateは更新が完了したときに関数が呼び出されることを期待しています

あなたは渡す必要があります

return Post.update({
    "_id": ObjectId.fromString(the_id)
}, {
    "title": "CHANGE"
}, function(err, model) {
    if (err) // handleerr

    res.redirect("/office/edit/posts"));
});

そうすれば、モデルが正常に更新されたときにのみリダイレクトします

3
Benoir