MongoDB 3.2无$操作符时更新数组嵌套文档的方法(含Mongoose)
在MongoDB 3.2中更新子文档的ordered字段为false(含Mongoose实现)
原生MongoDB Shell解决方案
由于MongoDB 3.2不支持$位置操作符批量更新数组元素,也无$[](3.6+版本引入),只能通过查询-修改-保存的方式处理:
单文档更新
// 查询目标文档 var targetDoc = db.yourCollection.findOne({ _id: 1 }); // 遍历books数组修改ordered字段 if (targetDoc && targetDoc.products && targetDoc.products.books) { targetDoc.products.books.forEach(bookItem => { bookItem.ordered = false; }); } // 保存修改后的文档 db.yourCollection.save(targetDoc);
批量更新所有文档
如果需要处理集合中所有包含products.books的文档:
db.yourCollection.find().forEach(doc => { if (doc.products && doc.products.books) { doc.products.books.forEach(bookItem => { bookItem.ordered = false; }); db.yourCollection.save(doc); } });
Mongoose实现方法
假设你的Mongoose模型名为Product,对应目标集合:
单文档更新
const updateSingleDoc = async () => { // 查询目标文档 const doc = await Product.findOne({ _id: 1 }); if (!doc || !doc.products?.books) return; // 修改数组内所有元素的ordered字段 doc.products.books.forEach(book => { book.ordered = false; }); // 保存修改 await doc.save(); }; // 执行更新 updateSingleDoc().catch(err => console.error(err));
批量更新所有文档
const updateAllDocs = async () => { const docs = await Product.find(); for (const doc of docs) { if (doc.products?.books) { doc.products.books.forEach(book => { book.ordered = false; }); await doc.save(); } } }; // 执行批量更新 updateAllDocs().catch(err => console.error(err));
注意:这种客户端侧修改的方式适合数据量不大的场景,32位MongoDB本身内存限制较大,也不会处理超大规模数据集。
内容的提问来源于stack exchange,提问作者user17885189
相关产品推荐
相关产品推荐

