ユーザーのお気に入りの映画のリストを表示するコレクションがあります。これがサンプルデータセットです...
{
"_id" : ObjectId("545c08dcc4d2b8a0243dd4db"),
"mail" : "mickey@mouse.com",
"name" : "Mickey Mouse",
"favorite_movies" : [
{
"name" : "The Green Mile",
"Year" : "1992"
},
{
"name" : "Raging Bull",
"Year" : "1980"
}
],
"watched_movies" : [
{
"name" : "The Green Mile",
"Year" : "1992"
},
{
"name" : "Jaws",
"Year" : "1976"
}
]
}
_id545c08dcc4d2b8a0243dd4db
と映画が与えられました
{
"name" : "InterStellar",
"Year" : "2014"
}
これを Node.js/MongoDB の watch_movies に追加する必要がある場合は、次の方法しかないと思います。
- 検索を使用してドキュメントを検索する
- 見つかったドキュメントに対して、watched_movies 配列に追加して findAndModify を実行します。
ステップ #2 は、 http://mongodb.github.io/node-mongodb-native/markdown-docs/insert.htmlの例に基づいています 。
これを行うより良い方法はありますか?具体的には、ステップ#1を回避できますか?
これが私がステップ#2をやっている方法です。しかし、「watched_movies」要素を取得するためにステップ 1 を実行し、新しいムービーをそれに追加して、movielist
//try to update
collection.findAndModify(
{'_id':new BSON.ObjectID(id)}, //query
[['_id','asc']], //sort order
{$set: {"watched_movies": movielist}}, //replacement
{new: true}, //options
function(err, newObject){
if(err) {
console.warn(err.message);
} else {
console.log("Updated !! " + JSON.stringify(newObject));
res.send(object);
}
});
このスキーマ設計を改善するための提案も受け付けています。