【问题标题】:How to find a record using dot notation & update the value in a schema using mongoose如何使用点符号查找记录并使用 mongoose 更新模式中的值
【发布时间】:2015-10-22 21:04:49
【问题描述】:

我正在使用猫鼬对我的数据库执行 CRUD 操作。这就是我的模型的外观。

var EmployeeSchema = new Schema({
  name: String,
  description: {
    type: String,
    default: 'No description'
  },
 department: [],
  lastUpdated: {
    type: Date,
    default: Date.now
  }

});

部门可以包含这样的对象数组。

[
      {
            "id" : "55ba28f680dec4383eeebf97",
            "text" : "Sales",
            "topParentId" : "55ba28f680dec4383eeebf8b",
            "topParentText" : "XYZ"
        }, 
        {
            "id" : "55ba28f680dec4383eeebf98",
            "text" : "IT",
            "topParentId" : "55ba28f680dec4383eeebf8b",
            "topParentText" : "XYZ"
        }, 
        {
            "id" : "55ba28f680dec4383eeebf94",
            "text" : "Marketing",
            "topParentId" : "55ba28f680dec4383eeebccc",
            "topParentText" : "ABC"
        }
]

现在我需要找到 department.id = '55ba28f680dec4383eeebf94' 的所有员工,然后我需要更新对象的文本。

Employee.find({'department.id': '55ba28f680dec4383eeebf94'}, function(err, Employees) {      
    _.each(Employees, function (emp) {    
      _.each(emp.department, function (dept) {
        if(dept.id === '55ba28f680dec4383eeebf94'){
          dept.text = 'XXXXX'; // How to update the employee to save the updated text
        }
      });

    });

  });

用该部门的更新文本保存员工的正确方法是什么?

【问题讨论】:

    标签: node.js mongodb mongoose mean.io


    【解决方案1】:

    迭代是代码不是执行此操作的“尖锐”方式。最好使用 MongoDB 更新操作符,特别是因为这里没有为数组项定义模式,所以无需担心规则:

    Employee.update(
        {'department.id': '55ba28f680dec4383eeebf94'},
        { "$set": { "department.$.text": "XXXXX" },
        function(err,numAffected) {
           // handling in here
        }
    );
    

    $set 是重要部分,否则会覆盖整个对象。和语句中的positional $ operator一样,所以只更新匹配的(数组中的查询项)索引。

    另请参阅.find**AndUpdate() 变体,了解返回修改后对象的方法。

    【讨论】:

    • 我还使用{multi: true} 选项来更新我找到的每条记录。
    【解决方案2】:

    我认为你可以使用update 模型:

    Employee.update({department.id: '55ba28f680dec4383eeebf94'}, {department.text: 'XXXXX'}, {multi: true}, 
        function(err, num) {
            console.log("updated "+num);
        }
    );
    

    第一个对象是查询,要查找什么:{department.id: '55ba28f680dec4383eeebf94'},第二个是更新,要更新什么:{department.text: 'XXXXX'} 第三个是传递给更新的选项,multi 表示每次更新你找到的记录:{multi: true}

    【讨论】:

    • 这对我不起作用。我正在使用布雷克斯七号答案并使用您的答案中的{multi: true}。投票支持该选项。谢谢
    猜你喜欢
    • 2017-03-12
    • 2022-01-24
    • 1970-01-01
    • 2013-06-19
    • 2017-03-12
    • 1970-01-01
    • 1970-01-01
    • 2014-07-07
    • 2021-05-17
    相关资源
    最近更新 更多