mongodb update多层嵌套数组解决办法

来源:互联网 发布:js array set 去重 编辑:程序博客网 时间:2024/05/16 15:03

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/

0 0
原创粉丝点击