【问题标题】:mongo how to update a documentmongo如何更新文档
【发布时间】:2015-11-16 07:08:33
【问题描述】:

给定来自名为 user 的集合的以下架构:

{
    "email": "somebody@gmail.com", 
    "classes": [
        {
            "className": "AAAA1111",
            "marks": [72, 85, 64],
            "grades": [20, 40, 30]
        },
        {
            "className": "BBBB2222",
            "marks": [12, 25, 43],
            "grades": [32, 42, 32]
        }
    ]
}

我如何为电子邮件为somebody@gmail.com?的人添加另一个课程

例如,如何添加子文档

{
    "className": "CCCC3333",
    "marks": [75, 85, 95],
    "grades": [20, 30, 50]
}

同时保留现有信息?如何在不影响文档其余部分的情况下删除类 AAAA1111?我是 mongo 的新手,我尝试过的解决方案遇到了麻烦。最佳做法是什么?

【问题讨论】:

  • 请把模式模型也给我们。
  • “users”是集合名称,还是文档中的键?
  • @RashadIbrahimov 我很抱歉,这是集合名称。
  • @errorreplicating 在这种情况下,我的回答解决了你的问题:)

标签: node.js mongodb mongodb-query nosql


【解决方案1】:

Push操作将新类添加到数组中:

db.users.update({"email": "somebody@gmail.com"}, {
    $push: {
        "classes": {
            "className": "CCCC3333",
            "marks": [75, 85, 95],
            "grades": [20, 30, 50]
        }
    }
});

拉取操作从数组中删除特定类:

db.users.update({"email": "somebody@gmail.com"}, {
    $pull: {
        "classes": {
            "className": "AAAA1111"
        }
    }
});

【讨论】:

    【解决方案2】:

    要向电子邮件为somebody@gmail.com 的人添加另一个类,请在更新文档中使用 positional $ 运算符,因为这会标识要更新的数组中的元素,而无需明确指定元素在数组中的位置。当您更新嵌入文档中的字段时,您需要使用点表示法。使用 dot notation 时,请将整个虚线字段名称括在引号中。下面更新了嵌入的users 文档中的classes 数组。

    定义一个updateClasses函数如下:

    var updateClasses = function(db, callback) {
       db.collection('classes').updateOne(
            { "users.email" : "somebody@gmail.com" },
            {
                "$push": {
                    "users.$.classes": {
                        "className": "CCCC3333",
                        "marks": [75, 85, 95],
                        "grades": [20, 30, 50]
                    }
                }
            }, function(err, results) {
            console.log(results);
            callback();
       });
    };
    

    调用updateClasses 函数。

    MongoClient.connect(url, function(err, db) {
        // handle error
        if (err) handleError(err);
    
        updateClasses(db, function() {
            db.close();
        });
    });
    

    要删除"AAAA1111" 类而不影响文档的其余部分,请使用 $pull 运算符,它会从现有数组中删除与指定条件匹配的一个或多个值的所有实例:

    db.collection('classes').updateOne(
        { "users.email" : "somebody@gmail.com" },
        {
            "$push": {
                "users.$.classes": {
                    "className": "AAAA1111"
                }
            }
        }, function(err, results) {
        console.log(results);
        callback();
    });
    

    【讨论】:

      【解决方案3】:

      要将class 添加到classes,您可以检索文档,将新的类数组推送到classes 并保存文档:

      users.findOne({
          email: 'somebody@gmail.com'
      }).exec(function(err, user) {
          var newClass = {
              className: 'CCCC3333',
              marks: [75, 85, 95],
              grades: [20, 30, 50]
          };
      
          user.classes.push(newClass);
          user.save(function(err) {
              if(err) console.log(err);
              console.log('Updated!');
          });
      });
      

      【讨论】:

        猜你喜欢
        • 2021-04-23
        • 2011-05-21
        • 2016-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-18
        • 2018-06-19
        • 1970-01-01
        相关资源
        最近更新 更多