>

몽구스에이 스키마가 있습니다 :

var CoinAmountSchema = new Schema(
{
    user: [{ type: Schema.ObjectId, ref: 'User' }],
    coinAmounts: [{
        _id: false,
        coinID: { type: Number, ref: 'Coin' },
        amount: Number
    }]
})

이 쿼리를 작성하고 있는데,이 쿼리는 userID 및 coinID를 확인하고 해당 coinID의 금액 만 업데이트해야합니다.

exports.coin_amount_update = [
(req, res, next) => {
    CoinAmount.update({
        "user": req.params.userId,
        "coinAmounts.coinID": req.params.coinId
    },
        {
            '$set': {
                'coinAmounts.$.amount': req.body.amount
            }
        },
        function (err, model) {
            if (err) {
                console.log(err)
                return res.send(err)
            }
            return res.json(model)
        })
}]

그러나 이와 같이 배열 금액의 첫 번째 동전 만 업데이트합니다. 그러나 "user": req.params.userId, 줄을 삭제하면  올바른 동전을 찾아 업데이트합니다. 그래도 사용자를 확인해야하는데 어떻게 작동합니까? 검색어 나 데이터의 구성 방식에 문제가 있습니까?

편집 : React-native로 요청을 보냅니다 :

fetch(`${apiBaseURL}/users/${getState().user._id}/coins/${id}/update`, {
        method: 'PUT',
        headers: {
            'Content-Type': 'application/json',
        },
        body: JSON.stringify({
            amount: getState().coins[id].amount
        }),
    })

요청이/users/: userID/coins/0/update 인 경우 (금액 : 1) 결과는

{ _id: 5a579d0d44e7390ba3029327,
  __v: 0,
  coinAmounts: 
   [ { coinID: 0, amount: 1 },
     { coinID: 1, amount: 0 },
     { coinID: 2, amount: 0 },
     { coinID: 3, amount: 0 },
     { coinID: 4, amount: 0 } ],
  user: [ 5a579d0d44e7390ba3029326 ] }

요청이/users/: userID/coins/1/동일한 금액으로 업데이트 된 경우 동일한 결과

하지만 앞에서 언급했듯이 userID 확인을 제거하면/users/: userID/coins/1/update 요청에서 다음을 생성합니다.

{ _id: 5a579d0d44e7390ba3029327,
      __v: 0,
      coinAmounts: 
       [ { coinID: 0, amount: 0 },
         { coinID: 1, amount: 1 },
         { coinID: 2, amount: 0 },
         { coinID: 3, amount: 0 },
         { coinID: 4, amount: 0 } ],
      user: [ 5a579d0d44e7390ba3029326 ] }

깨끗 했어.


  • 답변 # 1

    find 에서 두 개의 배열을 사용할 때 버그처럼 보입니다.   $ 와 함께  위치 업데이트, user 의 일치하는 인덱스를 얻습니다.   $ 를 위해  위치 업데이트

    아래 해결 방법을 시도했지만 둘 다 올바른 coinID를 업데이트합니다

    arrayFilters 를 사용하는

    해결 방법 -1

    db.coins.update(
        { "user" : "5a579d0d44e7390ba3029326" }, //user
        {
            $set: { "coinAmounts.$[elem].amount" : 1 } //update
        },
        { 
            multi: false,
            arrayFilters:   [
                {   "elem.coinID":  2 } //coinID
            ]
        }
    )
    
    
    elemMatch 를 사용하는

    해결 방법 -2  사용자 배열 용

    db.coins.update(
        { 
            "coinAmounts.coinID" : 1, //coinID
            "user" : { $elemMatch : { $eq : "5a579d0d44e7390ba3029326" } } //user
        }, 
        { $set : { "coinAmounts.$.amount" : 1 } } //update
    )
    
    

  • 이전 신속한 문자열 및 정수 배열
  • 다음 amazon ec2 - 크론에서 실행 된 스크립트에 파이썬 패키지를 사용할 수 없음