【问题标题】:findAndModify usage in node.js/MongoDbnode.js/MongoDb 中的 findAndModify 用法
【发布时间】:2014-11-07 11:40:00
【问题描述】:

我有一个集合,其中显示了用户列表以及他们最喜欢的电影。 这是一个示例数据集...

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

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

  1. 使用查找查找文档
  2. 通过附加到watched_movies数组对找到的文档执行findAndModify。

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

有没有更好的方法来做到这一点?具体可以避免步骤#1 吗?

这是我第 2 步的操作方式。 但是我不得不执行第 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);
   }
 });

我也愿意接受有关改进此架构设计的建议。

【问题讨论】:

    标签: node.js mongodb findandmodify


    【解决方案1】:

    您可以通过使用$push$addToSet 数组运算符直接将新电影添加到watched_movies 数组中,通过单个findAnyModify 调用来做到这一点:

    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);
         }
      });
    

    【讨论】:

    • 感谢您的提示! $addToSet 很棒。但这不适用于 findAndModify。我收到此错误“异常:nextsafe(): { $err:”无法规范化查询:badvalue 代码:17287。但它适用于 collection.update(),尽管它没有t 返回更新后的文档。
    • @EnnioMorricone 我把排序参数放回去了,现在测试结果很好。我没有意识到这总是需要的。
    猜你喜欢
    • 2017-03-11
    • 2020-12-07
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-30
    相关资源
    最近更新 更多