ZBLOG

已知 mongodb 一张表下有以下两组数据 [{a:[{b:1,c:[1,2,3]}]}, {a:[{b:2,c:[1,2,3]}]}] ; 使用mongoose 从中查询 b为1的那组数据,若发现有该组数据 使用[4,5,6]替换该节点c,若没找到就新增一组数据 {a:[{b:1,c::[4,5,6]}]}

假设表名为 “myCollection”,可以按照以下方式实现上述需求:

const mongoose = require('mongoose');

// 定义数据模型
const mySchema = new mongoose.Schema({
  a: [
    {
      b: Number,
      c: [Number]
    }
  ]
});

// 定义数据模型对应的集合名称
const MyModel = mongoose.model('MyModel', mySchema, 'myCollection');

// 查询并更新数据
MyModel.findOneAndUpdate(
  { 'a.b': 1 }, // 查询条件:b为1
  { $set: { 'a.$[elem].c': [4, 5, 6] } }, // 更新操作:将c替换为[4,5,6]
  { arrayFilters: [{ 'elem.b': 1 }], new: true } // arrayFilters指定更新哪个元素,new=true表示返回更新后的结果
)
  .then(doc => {
    if (doc) {
      console.log('已更新数据:', doc);
    } else {
      // 若没找到则插入一条新数据
      const newData = new MyModel({ a: [{ b: 1, c: [4, 5, 6] }] });
      newData.save().then(() => {
        console.log('已插入新数据:', newData);
      });
    }
  })
  .catch(err => {
    console.error(err);
  });

在查询条件中使用了 \(arrayFilters 操作符来指定查询哪个元素。\)arrayFilters 的值是一个数组,其中每个元素都是一个过滤器对象,用于匹配数组中相应位置的元素。

在更新操作中,使用了 \([elem] 操作符来指定更新哪个元素。\)[elem] 的值是一个过滤器对象,用于匹配数组中的一个元素。在 arrayFilters 中指定过滤器对象后,$[elem] 会自动指向匹配到的元素。

注意,以上代码仅适用于更新一条数据。如果查询结果包含多条数据,需要按照业务需求进行批量更新或插入新数据。

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=2443

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?