如何在本地将MongoDB查询应用到JavaScript对象?
在JavaScript对象上本地应用MongoDB风格的更新操作
如果你想在本地JS对象上直接用MongoDB的更新语法(比如$inc),不用依赖数据库,完全可以自己实现一个轻量的处理函数,不用找第三方库。
先实现核心的$inc操作
下面是一个简单的MongoQuery.apply函数,专门处理$inc逻辑:
const MongoQuery = { apply(obj, query) { // 处理$inc自增操作 if (query.$inc) { const incMap = query.$inc; for (const key in incMap) { // 如果对象里没有这个属性,默认从0开始加 obj[key] = (obj[key] || 0) + incMap[key]; } } return obj; } }; // 测试你的示例场景 let foo = {bar: 1}; MongoQuery.apply(foo, { $inc: {bar: 3} }); console.log(foo); // 输出 {bar: 4} // 测试属性不存在的情况 let emptyObj = {}; MongoQuery.apply(emptyObj, { $inc: {counter: 5} }); console.log(emptyObj); // 输出 {counter: 5}
扩展支持更多MongoDB更新操作
如果后续需要用到$set、$push这类常用操作,直接在函数里加对应的处理逻辑就行:
const MongoQuery = { apply(obj, query) { // 处理$inc if (query.$inc) { const incMap = query.$inc; for (const key in incMap) { obj[key] = (obj[key] || 0) + incMap[key]; } } // 处理$set:直接覆盖或设置属性 if (query.$set) { Object.assign(obj, query.$set); } // 处理$push:向数组添加元素 if (query.$push) { const pushMap = query.$push; for (const key in pushMap) { // 如果属性不是数组,先初始化为空数组 if (!Array.isArray(obj[key])) { obj[key] = []; } obj[key].push(pushMap[key]); } } return obj; } }; // 测试多操作组合 let user = {name: "Bob"}; MongoQuery.apply(user, { $set: {age: 30}, $inc: {loginCount: 1}, $push: {tags: "frontend"} }); console.log(user); // 输出 {name: "Bob", age: 30, loginCount: 1, tags: ["frontend"]}
为什么不用现成库?
如果只是需要少量常用的更新操作,自己实现的代码更轻量,不需要引入额外依赖。如果需要完整复刻MongoDB的所有更新逻辑,可以参考MongoDB官方的更新规则逐步扩展,但大部分本地模拟场景下,按需实现常用操作就足够了。
内容的提问来源于stack exchange,提问作者Adam D.
相关产品推荐
相关产品推荐

