亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Mongodb 更新數組過濾器 | 寫入異常:寫入錯誤:

Mongodb 更新數組過濾器 | 寫入異常:寫入錯誤:

Go
暮色呼如 2022-12-13 16:30:33
我有以下employee數據結構:{   "_id":{      "$oid":"62836b0b3c1e2c19eaaac07e"   },   "firstname":"jean",   "lastname":"paul",   "email":"[email protected]",   "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":"[email protected]",

   "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 關注
  • 100 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號