首页 文章

node.js / MongoDb中的findAndModify用法

提问于
浏览
0

我有一个集合,显示用户喜欢的电影列表 . 这是一个示例数据集......

{
        "_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"
                }              
        ]
}

现在给_id 545c08dcc4d2b8a0243dd4db 和一部电影

{
   "name" : "InterStellar",
   "Year" : "2014"
}

如果我需要将它添加到watched_movies,在Node.js / MongoDB中,我相信唯一的方法是

  • 使用“查找”查找文档

  • 通过附加到watched_movies数组,对找到的文档执行findAndModify .

步骤#2基于此处的示例http://mongodb.github.io/node-mongodb-native/markdown-docs/insert.html

有一个更好的方法吗 ?具体来说我可以避免步骤#1吗?

这是我如何强制执行步骤#1获取"watched_movies"元素,然后将新电影附加到它以构建 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);
   }
 });

我也对改进这种架构设计的建议持开放态度 .

1 回答

  • 0

    您可以使用$push$addToSet数组运算符通过单个 findAnyModify 调用直接将新影片添加到 watched_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);
         }
      });
    

相关问题