假设表名为 “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] 会自动指向匹配到的元素。
注意,以上代码仅适用于更新一条数据。如果查询结果包含多条数据,需要按照业务需求进行批量更新或插入新数据。