1

ユーザーのお気に入りの映画のリストを表示するコレクションがあります。これがサンプルデータセットです...

{
        "_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 に追加する必要がある場合は、次の方法しかないと思います。

  1. 検索を使用してドキュメントを検索する
  2. 見つかったドキュメントに対して、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);
   }
 });

このスキーマ設計を改善するための提案も受け付けています。

4

1 に答える 1

0

or配列演算子を使用して新しいムービーを配列に直接追加することfindAnyModifyにより、1 回の呼び出しでこれを行うことができます。$push$addToSetwatched_movies

var movie = {
   "name" : "InterStellar",
   "Year" : "2014"
};

collection.findAndModify(
  {'_id':new BSON.ObjectID(id)},
  [['_id','asc']],
  {$addToSet: {"watched_movies": movie}},
  {new: true},
  function(err, newObject){
     if(err) {
       console.warn(err.message);
     } else {
       console.log("Updated !! " + JSON.stringify(newObject));
       res.send(newObject);
     }
  });
于 2014-11-07T02:54:11.807 に答える