MongoDB 3.4:如何用JS函数拼接字段更新(替代$concat)及参数传递
在MongoDB 3.4中实现无$concat的字段拼接更新
核心逻辑
MongoDB 3.4还不支持在更新操作里直接引用文档的当前字段值,所以得通过先查询再更新的流程:先把目标文档拉到客户端,用JS函数处理字段值,再把结果写回数据库。
具体实现
单文档更新
先查询出目标文档,拿到当前name值后传入自定义函数处理,再执行更新:
var updateName = function(nameValue) { return nameValue + "123"; }; // 先查询目标文档 var targetDoc = db.test.findOne({_id: ObjectId("123")}); if (targetDoc) { // 确保文档存在再操作 var newName = updateName(targetDoc.name); db.test.updateOne({_id: ObjectId("123")}, {$set: {name: newName}}); }
批量文档更新
如果要处理多个符合条件的文档,用forEach循环遍历处理:
var updateName = function(nameValue) { return nameValue + "123"; }; // 遍历符合条件的文档,逐个更新 db.test.find({/* 这里写你的查询条件 */}).forEach(function(doc) { var newName = updateName(doc.name); db.test.updateOne({_id: doc._id}, {$set: {name: newName}}); });
关于你提供的代码的问题
你写的代码里直接在$set里调用updateName(),是拿不到数据库里的name字段值的——这个函数是在客户端本地执行的,而更新语句是发送到MongoDB服务器运行的,客户端函数没法直接访问服务器上的文档数据。
要实现传入已有name字段值,必须先把文档查询到客户端,再将doc.name作为参数传入updateName,就像上面示例里的updateName(targetDoc.name)那样,之后再把处理后的结果传入$set完成更新。
内容的提问来源于stack exchange,提问作者gkd
相关产品推荐
相关产品推荐

