我正在使用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
}
});
});
});
使用该部门的更新文本保存员工的正确方法是什么?
答案 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()
变体以了解返回修改对象的方法。