如何使用点符号和&amp ;;找到记录使用mongoose更新模式中的值

时间:2015-07-31 08:46:13

标签: node.js mongodb mongoose mean.io

我正在使用mongoose在我的数据库上执行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
        }
      });

    });

  });

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

2 个答案:

答案 0 :(得分: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'},第三个是传递给更新的选项,{{ 1}}表示更新您找到的每条记录:multi

答案 1 :(得分:2)

迭代是代码不是一种“尖锐”的方式来做到这一点。最好使用MongoDB更新运算符,特别是因为这里没有为数组项定义模式,因此不需要担心规则:

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

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

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