我需要更新所有現有檔案并加密敏感資訊。我在我的代碼中撰寫了如下腳本來加密每個檔案中的“名稱”欄位:
const update = await User.updateMany(
{},
{
$set: {
name: {
$function: {
body: function (name) {
return encrypt(name);
},
args: ['$name'],
lang: 'js'
}
}
}
}
);
但是我收到此錯誤:
server/node_modules/mongoose/lib/query.js:4777
const castError = new CastError();
^
CastError: Cast to string failed for value "{
'$function': { body: [Function: body], args: [ '$name' ], lang: 'js' }
}" (type Object) at path "name"
at model.Query.exec (/node_modules/mongoose/lib/query.js:4777:21)
at model.Query.Query.then (/node_modules/mongoose/lib/query.js:4876:15)
at processTicksAndRejections (node:internal/process/task_queues:96:5) {
messageFormat: undefined,
stringValue: '"{\n'
" '$function': { body: [Function: body], args: [ '$name' ], lang: 'js' }\n"
'}"',
kind: 'string',
value: {
'$function': { body: [Function: body], args: [ '$name' ], lang: 'js' }
},
path: 'name',
reason: null,
valueType: 'Object'
}
有誰知道這意味著什么?被困在這個問題上一段時間了。謝謝
uj5u.com熱心網友回復:
因此,您實際上對此代碼有多個問題,我將從您發布的錯誤開始。這是一個mongoose鑄造錯誤。
您正在嘗試將聚合 $function函式用作正常更新的一部分,這是不允許的 -mongoose反過來又試圖將“名稱”值轉換為字串,因為這是它期望從架構定義中獲得的內容。這是你得到的錯誤。
因此,要解決問題 #1,您希望使用允許使用的聚合管道更新語法$function,并停止使用mongoose,它的“模式”保護對于高級語法使用來說真的很糟糕。
評論中提到的第二個問題由于Mongodb如何決議和執行代碼而不起作用,它不像普通的“編譯器”那樣將函式呼叫即時轉換為代碼。
相反,它將這個“物件”發送到內部引擎,并在那里嘗試執行它,因此在 Mongo 的內部分數中沒有這樣的功能。
為了克服這個問題,您需要首先將自定義函式存盤在 mongo 中,這實際上非常簡單,如下所述:
db.system.js.insertOne(
{
_id: "encrypt",
value : function(x) { return x; }
}
);
現在隨著#1 的變化,你的代碼應該可以作業了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/526577.html
上一篇:獲取賣家的所有訂單并按日期排序?
