FindOneAndUpdate中的两个查询无法使用数组

时间:2018-01-12 18:29:06

标签: node.js mongodb mongoose

我在Mongoose中有这个架构:

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 个答案:

答案 0 :(得分:0)

find中使用$位置更新的两个数组时,它看起来像一个错误,它获得了user位置更新{/ 1}}的匹配索引

尝试了下面的解决方法,两者都更新了正确的coinID

解决方法-1,使用$

arrayFilters

解决方法-2,使用db.coins.update( { "user" : "5a579d0d44e7390ba3029326" }, //user { $set: { "coinAmounts.$[elem].amount" : 1 } //update }, { multi: false, arrayFilters: [ { "elem.coinID": 2 } //coinID ] } ) 用于用户数组

elemMatch