为了账号安全,请及时绑定邮箱和手机立即绑定

Mongodb 更新数组过滤器 | 写入异常:写入错误:

Mongodb 更新数组过滤器 | 写入异常:写入错误:

Go
暮色呼如 2022-12-13 16:30:33
我有以下employee数据结构:{   "_id":{      "$oid":"62836b0b3c1e2c19eaaac07e"   },   "firstname":"jean",   "lastname":"paul",   "email":"employee@test.co",   "password":"d94307e0eabb9bba1ea1291e4b043175e11dcc43875a4858690e5c236b989f3e",   "salt":"2CzpCiIbiyYcSxQ",   "organizations":[      {         "organizationid":{            "$oid":"62836aa93c1e2c19eaaac07d"         },         "organizationname":"test",         "ismanager":false,         "groups":[            {               "name":"mongroupe",               "permissions":[                  0,                  2               ]            }         ],         "permissions":[            1         ]      }   ]}我正在尝试在 go 中构建一个向数组添加一组权限的函数organizations.[x].groups.[x].permissions。每个permission都是一个简单的整数。我想出了以下代码:func AddPermissionsToGroup(groupName string, organizationId primitive.ObjectID, permissions []global.Permission) error {        if res, err := employeesCollection.UpdateMany(        context.TODO(),        bson.M{},        bson.M{            "$addToSet": bson.M{                "organizations.$[org].groups.$[grp].permissions": bson.M{                    "$each": permissions,                },            },        },        options.Update().SetArrayFilters(            options.ArrayFilters{                Filters: []interface{}{                    bson.M{                        "org.organizationid": organizationId,                    },                    bson.M{                        "grp.name": groupName,                    },                },            },        ),    ); res.MatchedCount == 0 {        return global.ErrEntityNotFound    } else if res.ModifiedCount == 0 {        return global.ErrNoUpdateNeeded    } else if err != nil {        return fmt.Errorf("failed updating employees | %s", err.Error())    }    return nil}该代码返回以下错误:写入异常:写入错误:[无法将数组更新应用于非数组元素组:null]。我不知道这是什么意思。也许引擎不喜欢我使用两个 s 的事实ArrayFilter?
查看完整描述

1 回答

?
叮当猫咪

TA贡献1776条经验 获得超12个赞

好的,所以我创建了这个有效的游乐场:https ://mongoplayground.net/p/Tznz7btfLkH


实际上问题不是因为请求本身在语法上是有效的。这是因为我在employee集合中有另一个文档,看起来像这样:


{

   "_id":{

      "$oid":"62836aa93c1e2c19eaaac07c"

   },

   "firstname":"jean",

   "lastname":"charles",

   "email":"manager@test.co",

   "password":"6776c354fce809e7be234f84d0ea907cfd3aba350871a18858ceccc10eabc036",

   "salt":"IHaPJIKVVplC8ni",

   "organizations":[

      {

         "organizationid":{

            "$oid":"62836aa93c1e2c19eaaac07d"

         },

         "organizationname":"test",

         "ismanager":true,

         "groups":null,

         "permissions":null

      }

   ]

}

如您所见,groups此处的值为空。这就是问题所在。


基本上,当 arrayfilter namedgrp遇到空对象时,它会引发错误,因为它无法对其应用。


因此,使请求有效的解决方案是确保集合中的每个文档都group初始化了这个数组(即使它是空的,也没关系)。一旦我这样做了,就没有问题了。


查看完整回答
反对 回复 2022-12-13
  • 1 回答
  • 0 关注
  • 83 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信