apiKeys
ユーザーの下にオブジェクトのネストされた配列として保存されているリストがあります。更新クエリを使用してキーを取り消そうとしていますが、クエリが間違ったレコードを更新しています(最初のisActive:true
配列要素のようです)。
db.users.update({
$and: [
{ _id: <TheUserId> },
{ 'apiKeys._id': <TheKeyId> },
{ 'apiKeys.isActive': true } // This means the revoked date can't be changed
]
},
{
$set: {
'apiKeys.$.isActive': false,
'apiKeys.$.revokedAt': new Date()
}
})
不思議なことに、 { _id: <TheUserId> }
(これは私の側の誤った印象かもしれませんが)削除すればうまくいくよう です。
編集:私はこれについて間違っていました
このアプローチは間違っています。両方のプロパティがいずれかのオブジェクトで独自の条件を検索し、2番目のプロパティの条件に依存しません。両方のプロパティが同じオブジェクトにあることを指定する必要があります。
{ 'apiKeys._id': <TheKeyId> },
{ 'apiKeys.isActive': true }
$ elemMatchを使用して、両方のフィールドが同じオブジェクトにあることを指定する必要があります。
db.collection.update({
_id: <TheUserId>,
apiKeys: {
$elemMatch: {
_id: <TheKeyId>,
isActive: true
}
}
},
{
$set: {
"apiKeys.$.isActive": false,
"apiKeys.$.revokedAt": new Date()
}
})
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加