我有一份文件---
Employees:[
{
name:"abc",
contact:"123",
email:"xyz@gmail.com"
},
{
name:"efg",
contact:"456",
email:"efg@gmail.com"
},
{
name:"hij",
contact:"789",
email:"hij@gmail.com"
}
]
对于列表中的所有键名,我需要使用value =“abc”更新名称。
我尝试更新
db.collection.update(
{ "_id" : ObjectId("5308595e3256e758757b4d2f") },
{ "$set": { "Employees.name " : "abc" } }
);
但是得到错误:不能使用部分(Employees of Employees.name)来遍历元素。
答案 0 :(得分:30)
这些是在一个数组中,所以这就是你当前语句不起作用的原因。您有几个选项可以执行此操作,因为没有简单的语句可以执行此操作。
1。您知道数组中有多少元素,因此请使用" dot-notation"
明确设置它们 db.collection.update(
{ "_id" : ObjectId("5308595e3256e758757b4d2f") },
{
"$set": {
"Employees.0.name " : "abc",
"Employees.1.name " : "abc",
"Employees.2.name " : "abc"
}
}
);
2。您不知道但是准备发布此更新,直到返回"已修改"文档变为0.然后您可以在更新中使用位置$
运算符,但这一次只能匹配一个元素:
db.collection.update(
{
"_id" : ObjectId("5308595e3256e758757b4d2f"),
"Employees.name": { "$ne": "abc" }
},
{
"$set": {
"Employees.$.name " : "abc"
}
}
);
3. 检索文档并更新代码中的所有数组成员:
var doc = db.collection.findOne({
"_id": ObjectId("5308595e3256e758757b4d2f")
});
doc.Employee.forEach(function(emp) {
emp.name = "abc";
});
db.collection.update(
{ "_id": doc._id },
{ "$set": { "Employee": doc.Employeee } }
)
这些是基本方法并且这样做,以及一些实际示例,说明为什么目前无法在单个语句中完成更新每个数组成员字段。