2010年12月10日金曜日

mongoDBのinsert(update)で他のコレクションからfindした値を配列に入れる方法

まず、
subscribers{ 
_id:id,
theme:"theme",
subscriber:"user_id"
}
こんな感じのsubscribersコレクションがあると仮定。
これはあるテーマの購読者を持っているコレクションとします。
で、これをtheme_nameの記事が新しく追加されるとき記事の方にも持ってきたい。

ただこれをfindでそのまま持ってくるとBSON形式になってしまうので特定キーの値だけを配列として入れ込みたい。どっかにサンプルあるのかもしれないけどドキュメント見ながら色々試した感じいけそうなやりかたを発見。
ドキュメントの「集約」にあるdistinct
これを使うと
db.subscribers.distinct("subscriber",{theme:"theme"})
[ "user_id1","user_id2","user_id3" ]
と配列で返してくれるから
db.article.insert({
title:"title",body,"body",theme:"theme",
subscribers: db.subscribers.distinct("subscriber",{theme:"theme"})
})
でうまくいくはず。

既存の記事にsubscriberが増えた場合は
db.article.update({theme:"theme_name"},{$addToSet:{subscribers:"new_subscriber"}})
で、減る場合は$addToSetと$pullに変更。

インタラクティブシェルでは問題なく動いたから、後はパフォーマンスがどうなるかとScalaからどうやってアクセスするか。distinctがサポートされてなかったらストアドファンクション作るしかないのかな?

もっといい方法を知ってる方がいたらぜひ教えてください。。。

0 件のコメント:

コメントを投稿