我在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 ] }
希望我很清楚。
答案 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