読者です 読者をやめる 読者になる 読者になる

"Diary" インターネットさんへの恩返し

いつもソースコードコピペばかりなので,みなさまへ少しばかりの恩返しを

node.js x mongoose での組み込みドキュメント(サブドキュメント)の使い方



スポンサーリンク


f:id:azumami:20160922002437p:plain

コレクション間に親子関係を持たせてデータを管理できる機能のサブドキュメント。

例)

・familyコレクションのサブドキュメントとして"children"ドキュメントを持つ。

   "father" : "ジョンお父さん"
   "mother" : "キャサリング母さん"
   "children" : [ "name" : "イチロウ", "sex" : "男"]
                [ "name" : "花子", "sex" : "女"]

[目次]

複数データの一括挿入

フォーム(例:nameがcomment[])で取得したデータを挿入

//Dataというモデルがあるとする
var newData = new Data(); 

// フォーム name = titleの値を挿入
newData.title  = req.body.title;   

req.body.comment.forEach(function(entry) {  //フォーム comment[]の値の分だけpush
    newData.comment.push({ 
        comment_title : entry
    });
});

//DBに保存
newData.save(function(err,newData,count){
    if(err) return next(err);
});

組み込みドキュメントの一覧取得

組み込みドキュメントの内容をループ処理する場合。foreachを使うとうまくいかなず、"has no method"となる。forを使う必要があるようだ。


foreachを使った場合

[プログラム]
data[0].member.foreach(function(entry) {
    console.log(entry);
});

[結果]
/vagrant/chat/routes/controller.js:616
            data[0].member.foreach(function(entry) {
                                ^
TypeError: Object { 組み込みドキュメントの内容 } has no method 'foreach'

forを使った場合

for(i=0;i<chat_data[0].member.length;i++){
    console.log(chat_data[0].member[i].email);
}

組み込みドキュメント一括削除

_idがidのドキュメント内の組み込みドキュメントcommetを一括削除

Data.update(
   {"_id":id},
   {
      'comment' :[]
   },
   function(err){
      console.log(err);
   }  
);

組み込みドキュメント内検索(完全一致・部分一致)

articleが親コレクションで、commentコレクションが子とする。commentに"hello"のものを検索

例:articleはsubject、content、commentを持ち、commentはtextを持つとする。

//完全一致
article.find( { 'comment.text': 'hello' }, function(err, data){
   console.log(data);
)}

//部分一致

var re = new RegExp('hello', 'i');

article.find( { 'comment.text': { $regex: re } }, function(err, data){
   console.log(data);
)}

参考

Mongoose SubDocuments v4.6.1

はじめてのMongoDB (I・O BOOKS)

はじめてのMongoDB (I・O BOOKS)