mongodbupdate多层嵌套数组解决办法。
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:只能使用一个$占位符的问题在社区里已经提了很久了,一直没有得到解决,希望下个版本可以解决。