NodeJS中如何更新MongoDB数组内指定游戏的paymentStatus字段
NodeJS 更新 MongoDB 文档中 games 数组指定游戏的 paymentStatus 字段
需求说明
通过传入ballpool或valorant作为游戏参数,更新MongoDB文档内games数组中对应游戏对象的paymentStatus字段。文档数据结构如下:
{ "uniqueCode": "n5Eue", "games": [ { "ballpool": { "email": "aniketshaw@gmail.com", "name": "Aniket Shaw", "phone": "31231231", "ballpoolUID": "4232", "paymentStatus": false, "_id": "63de237567fa64e9711bb2b7", "__v": 0 } }, { "valorant": { "_id": "63de237567fa64e9711bb2b7", "email": "aniketshaw@gmail.com", "name": "Aniket Shaw", "phone": "31231231", "valorantUID": "4232", "paymentStatus": true, "__v": 0 } } ] }
实现方案
方案1:使用Mongoose(ORM)
假设你的数据模型名为Registration,以下是封装的更新函数:
const updatePaymentStatus = async (uniqueCode, gameName, newStatus) => { try { // 动态构建更新路径,定位到目标游戏的paymentStatus const updatePath = `games.$.${gameName}.paymentStatus`; const result = await Registration.updateOne( { uniqueCode, // 匹配games数组中包含指定游戏键的元素 games: { $elemMatch: { [gameName]: { $exists: true } } } }, { $set: { [updatePath]: newStatus } } ); if (result.modifiedCount > 0) { console.log(`已成功将${gameName}的paymentStatus更新为${newStatus}`); } else { console.log("未找到匹配文档或无需更新"); } return result; } catch (error) { console.error("更新操作失败:", error); throw error; } }; // 调用示例:更新n5Eue对应的ballpool支付状态为true updatePaymentStatus('n5Eue', 'ballpool', true);
方案2:使用原生MongoDB驱动
如果你直接使用MongoDB原生驱动,代码逻辑类似:
const { MongoClient } = require('mongodb'); const updatePaymentStatus = async (uniqueCode, gameName, newStatus) => { const uri = 'mongodb://localhost:27017'; // 替换为你的MongoDB连接地址 const client = new MongoClient(uri); try { await client.connect(); const db = client.db('your-db-name'); // 替换为数据库名 const collection = db.collection('your-collection-name'); // 替换为集合名 const updatePath = `games.$.${gameName}.paymentStatus`; const result = await collection.updateOne( { uniqueCode, games: { $elemMatch: { [gameName]: { $exists: true } } } }, { $set: { [updatePath]: newStatus } } ); console.log(`匹配到${result.matchedCount}个文档,成功更新${result.modifiedCount}个`); return result; } finally { // 确保连接关闭 await client.close(); } }; // 调用示例:更新n5Eue对应的valorant支付状态为false updatePaymentStatus('n5Eue', 'valorant', false);
进阶:更新数组中所有匹配的游戏元素
如果games数组中存在多个相同游戏名的元素,上述方案只会更新第一个匹配项。若要更新所有匹配的元素,可以使用MongoDB 3.6+支持的数组过滤功能:
// Mongoose版本示例 const result = await Registration.updateOne( { uniqueCode }, { $set: { [`games.$[elem].${gameName}.paymentStatus`]: newStatus } }, { arrayFilters: [{ [`elem.${gameName}`]: { $exists: true } }] } );
这个写法会遍历games数组,更新所有包含指定游戏键的元素的paymentStatus字段。
内容的提问来源于stack exchange,提问作者Debajyoti Bhattacharjee
相关产品推荐
相关产品推荐

