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

发布于 2022-09-12 01:02:55 字数 1408 浏览 14 评论 0

多层嵌套数组更新采用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以后,实现了我的效果。

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文