mongodb 多层嵌套数组更新时,如何把arrayFilter应用到筛选中

多层嵌套数组更新采用arrayFilter方式,但是不知道如何实现upsert的效果
例如有这么一组数据:
data=[['1','2','4'],['1','2','5'],['1','3','6'],

  ['0','3','7'],['0','3','8']]
 

我想拼接成如下形式作为数据字段的值:

{
    '_id':a,
    'data':
    [
        {
            '_id':1,
            'sub':[
                {
                    '_id':2,
                    'sub2':[
                        {'_id':4},
                        {'_id':5}
                    ]
                },
                {
                    '_id':3,
                    'sub2':[
                        {'_id':6}
                    ]
                }
            ]
        },
        {
            '_id':0,
            'sub':[
                '_id':3,
                'sub2':[
                    {'_id':7},
                    {'_id':8}
                ]
            ]
        }
    ]
 }

我的想法是遍历data,然后依次按层级添加,例如添加第一层的1和0的时候我用的是

db.test.update({'_id':a,'data._id':{$ne:data[0]}},{$push:{'data._id':data[0]}})

这样可以实现data第一层的1和0的upsert效果,但是当我尝试对第二层使用同样的手段时:

db.test.update({'_id':a,'data.$[a].sub._id':{$ne:data[1]}},{$push:{'data.$[a].sub':{'_id':data[1]}}},{'arrayFilters':[{'a._id':data[0]}]})

$[a]似乎并不起作用,虽然sub数组中有'_id':2,但还是会添加一个,把 $[a]修改为0以后,实现了我的效果。

如果按照获取索引后更新的办法,可想而知更新第三层级的时候过于繁杂,这个有什么解决办法吗?还是必须获取索引后更新?

阅读 2.6k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进