version: 3.4.3
{ "_id" : 1
"user_id": 1,
"message" : "Yes"
"translations" : [
{
"destination" : "fr",
"text": "Oui"
},
{
"destination" : "bf",
"text": "uid"
},
]
}
如果是一层数组,可以用如下语句更新数组里指定key的value
db.getCollection('message').update({
'_id': 1,
'translations.destination': 'fr'
},
{
'$set': {
"translations.$.text": "asd"
}
}
如果再加一层嵌套
{ "_id" : 1
"user_id": 1,
"message" : "Yes"
"translations" : [
{
"destination" : "fr",
"text": "Oui",
"rating" : [
{ "user_id" : 1,
"rating" : 1
},
{ "user_id" : 2,
"rating" : 1
}
]
}
]
}
使用这个更新语句就会报错了
db.getCollection('message').update({
'_id': 1,
'translations.destination': 'fr',
'translations.rating.user_id':'1'
},
{
'$set': {
"translations.$.rating.$.rating": 5
}
}
目前mongodb不支持多个$占位符,推荐的方法的修改数据结构,把数据格式改成这样,把数组元素改成key-value形式
{ "_id" : 1
"user_id": 1,
"message" : "Yes"
"translations" : {
"fr": {
"destination" : "fr",
"text": "Oui",
"rating" : [
{ "user_id" : 1,
"rating" : 1
},
{ "user_id" : 2,
"rating" : 1
}
}
},
"en": {...}
]
}
执行如下更新语句
db.getCollection('message').update({
'_id': 1,
'translations.destination': 'fr',
'translations.rating.user_id':'1'
},
{
'$set': {
translations.fr.rating.$.rating”: 5
}
}
ps:只能使用一个$占位符的问题在社区里已经提了很久了,一直没有得到解决,希望下个版本可以解决
国内解决问题的方法太少,还是需要多去国外的论坛网站看看
方法来自于:https://pythonolyk.wordpress.com/2016/01/17/mongodb-update-nested-array-using-positional-operator/