この記事は 約 1分3秒 で読めます。
「node-mongoose」っていうMongoDBを簡単に使えるモジュールがあるんですが、ドキュメント内のネストされた値の変更がわからなくていろいろ調べた結果、なんとかできました。MEANスタックでアプリ作っててDB保存はなにかと時間がかかりましたよ(ため息)
node.jsの日本語サイトで欲しい情報なかなか見つからず…こういう情報ってもはや知ってて当然なんですかね。
余談ですが、node.js使える天才プログラマーの皆さんは是非ブログ書いてほしいです。あなた達の才能の片鱗でもいいのでおすそ分けしてください。
(英語でも才能はギフトって言いますし)
そんな訳で以下、ソースコードです。
こんなモデルを定義したとします。
※generator-angular-fullstackの書式なので、requireなどは適宜読み換えてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
var mongoose = require('bluebird').promisifyAll(require('mongoose')); var Schema = mongoose.Schema; var ScrapingSchema = new Schema({ title: String, contents: [ { url :String, title :String, content :String, isPosted : Boolean, createdAt: { type: Date, default: Date.now } } ], createdAt: { type: Date, default: Date.now } }); module.exports = mongoose.model('Scraping', ScrapingSchema); |
「contents」配列内のあるオブジェクトの「isPosted」を操作したいという場合、これで更新できました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
exports.updateIsPosted = function(req, res) { Scraping.update( {_id: req.params.id, 'contents._id': req.params.contentId}, {$set: { 'contents.$.isPosted': req.params.flag }}, function(err, num) { if (err) { return handleError(res)(err); } if(num === 0) { return res.send(404).end(); } exports.show(req, res); } ); }; |
以上です。