mongodb updateOne 如何修改查询数组结果中的第一项?

我的数据是这样的:

image.png

我想通过 updateOne 更改 prizes 数组中的第一个 8.8,我的代码是这样的:

let email = 'aa@bb.com'
let money = '8.8'
mongoserve.updateOne({
  _id: data[0]._id
}, {
  $set: { // 更新值,prize 为遍历变量
    'prizes.$[prize]': {
      email: email,
      prize: money
    }
  }
}, {
  arrayFilters: [ // 匹配值
    { 'prize': { $eq: money } }
  ]
}).then(data => {
  res.send('抽奖成功')
}).catch(error => {
  console.error(error)
})

但更新会将数组中两个 8.8 都修改掉
我尝试再 prizes.$[prize] 后面再追加 .$ 或 .1 结果都是报错

还望指点如何更新结果(数组)的第一个匹配项呢?


当然笨办法是先通过遍历将 prizes 修改好,之后赋给 updateOne 修改,但目前自己不想这么做

阅读 1.9k
1 个回答
let email = 'aa@bb.com';
let money = '8.8';

mongoserve.findOne({
  _id: data[0]._id
}).then(doc => {
  let index = doc.prizes.findIndex(prize => prize == money);

  // 构建一个更新操作符
  let updateOperator = { $set: {} };
  updateOperator.$set['prizes.' + index] = {
    email: email,
    prize: money
  };

  // 用这个索引去进行更新操作
  return mongoserve.updateOne({
    _id: data[0]._id
  }, updateOperator);
}).then(data => {
  res.send('抽奖成功');
}).catch(error => {
  console.error(error);
});
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题