0

ユーザーが配列内の電子メールを更新できるようにしようとしています。編集をクリックすると、特定のメールを更新したいと考えています。古い値と新しい値があります。プルとプッシュを実行できることはわかっていますが、値を $elemMatch と一致させてから $set で新しい値を設定することで、より効率的な方法で実行できるかどうかを確認したかったのですか? 位置演算子を試しましたが、fieldx: value x を意味するキー関係のない配列内の値だけでは機能しません...これが私の試みですが、どうすればよいかわかりませんか? 他の方向性は歓迎されます。

User.findByIdAndUpdate(req.signedCookies.userid,{
            emailList: { $elemMatch: {oldEmail, {$set: {req.body.updateEmail}}}}
        }, function(err, userX) {});
4

1 に答える 1

0

MongoDB の構文は次のようになります。

> db.test.insert({userId: '1234', emailList: ['abc', 'def']})
> db.test.find()
{ "_id" : ObjectId("520eaade49177daf439a2ffa"), userId: '1234', "emailList" : [ "abc", "def" ] }
> db.test.update({userId: '1234', emailList: 'abc'}, {$set: {'emailList.$': 'ghi'}})
> db.test.find()
{ "_id" : ObjectId("520eaade49177daf439a2ffa"), userId: '1234', "emailList" : [ "ghi", "def" ] }
>

その場合、Mongoose コードは次のようになります。

User.findOneAndUpdate({userId: '1234', emailList: 'abc'}, {$set: {'emailList.$': 'ghi'}})

これにより、$pull と $push ではなく、1 つのクエリで変更を加えることができます。

ドキュメントの配列ではなく、値の配列を検索しているため、$elemMatch は必要ありません。配列を直接クエリするだけで、MongoDB はその内部を調べて値を照合することを知っています。

于 2013-08-16T22:44:03.480 に答える