使用另一个字段的值更新 MongoDB 字段

2024-01-07

在 MongoDB 中,是否可以使用另一个字段的值来更新一个字段的值?等效的 SQL 类似于:

UPDATE Person SET Name = FirstName + ' ' + LastName

MongoDB 伪代码是:

db.person.update( {}, { $set : { name : firstName + ' ' + lastName } );

最好的方法是在 4.2+ 版本中,它允许在update文件和updateOne https://docs.mongodb.com/master/reference/method/db.collection.updateOne/#update-with-aggregation-pipeline, updateMany https://docs.mongodb.com/master/reference/method/db.collection.updateMany/#update-with-an-aggregation-pipeline, or update https://docs.mongodb.com/master/reference/method/db.collection.update/#update-with-aggregation-pipeline(在大多数(如果不是全部)语言驱动程序中已弃用)收集方法。

MongoDB 4.2+

4.2版本还引入了$set https://docs.mongodb.com/master/reference/operator/aggregation/set/管道阶段运算符,它是$addFields https://docs.mongodb.com/manual/reference/operator/aggregation/addFields/。我会用$set在这里maps以及我们正在努力实现的目标。

db.collection.<update method>(
    {},
    [
        {"$set": {"name": { "$concat": ["$firstName", " ", "$lastName"]}}}
    ]
)

请注意,该方法的第二个参数中的方括号指定聚合管道而不是普通更新文档,因为使用简单文档将not正常工作。

MongoDB 3.4+

在 3.4+ 中,您可以使用$addFields$out https://docs.mongodb.com/manual/reference/operator/aggregation/out/聚合管道运算符。

db.collection.aggregate(
    [
        { "$addFields": { 
            "name": { "$concat": [ "$firstName", " ", "$lastName" ] } 
        }},
        { "$out": <output collection name> }
    ]
)

请注意,这不会更新您的集合,而是替换现有集合或创建新集合。另外,对于需要的更新操作“打字”,您将需要客户端处理,并且根据操作的不同,您可能需要使用find()方法而不是.aggreate() method.

MongoDB 3.2 和 3.0

我们这样做的方法是$project https://docs.mongodb.com/manual/reference/operator/aggregation/project/阅读我们的文件并使用$concat https://docs.mongodb.com/manual/reference/operator/aggregation/concat/字符串聚合运算符返回连接的字符串。 然后你迭代cursor并使用$set https://docs.mongodb.com/manual/reference/operator/update/set/更新运算符将新字段添加到您的文档中,使用批量操作以获得最大效率。

聚合查询:

var cursor = db.collection.aggregate([ 
    { "$project":  { 
        "name": { "$concat": [ "$firstName", " ", "$lastName" ] } 
    }}
])

MongoDB 3.2 或更高版本

您需要使用bulkWrite https://docs.mongodb.com/manual/reference/method/db.collection.bulkWrite/ method.

var requests = [];
cursor.forEach(document => { 
    requests.push( { 
        'updateOne': {
            'filter': { '_id': document._id },
            'update': { '$set': { 'name': document.name } }
        }
    });
    if (requests.length === 500) {
        //Execute per 500 operations and re-init
        db.collection.bulkWrite(requests);
        requests = [];
    }
});

if(requests.length > 0) {
     db.collection.bulkWrite(requests);
}

MongoDB 2.6 和 3.0

从这个版本开始,您需要使用现已弃用的Bulk https://docs.mongodb.com/manual/reference/method/Bulk/#BulkAPI及其相关方法 https://docs.mongodb.com/manual/reference/method/js-bulk/.

var bulk = db.collection.initializeUnorderedBulkOp();
var count = 0;

cursor.snapshot().forEach(function(document) { 
    bulk.find({ '_id': document._id }).updateOne( {
        '$set': { 'name': document.name }
    });
    count++;
    if(count%500 === 0) {
        // Excecute per 500 operations and re-init
        bulk.execute();
        bulk = db.collection.initializeUnorderedBulkOp();
    }
})

// clean up queues
if(count > 0) {
    bulk.execute();
}

MongoDB 2.4

cursor["result"].forEach(function(document) {
    db.collection.update(
        { "_id": document._id }, 
        { "$set": { "name": document.name } }
    );
})
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用另一个字段的值更新 MongoDB 字段 的相关文章

  • mongodb 查询 DBRef 类型

    如何在 mongodb shell 中将此查询转换为有效的 mongodb 查询 cars owner ref users cars owner这里是一个 DBRef 但是 ref是无效的 我收到此错误 err Positional ope
  • PowerShell 与 MongoDB C# 驱动程序方法不兼容?

    由 C 泛型引起的最新 MongoDB 驱动程序的问题 Cannot find an overload for GetCollection and the argument count 1 我可能可以使用其他没有泛型的 GetCollect
  • Express js 错误:“express 已弃用 res.sendfile:请改用 res.sendFile”

    设置路径的正确方法是什么 在我的应用程序中 我使用此代码设置发送文件的路径 app get function req res get put post delete res sendfile dirname client views ind
  • 我可以按日期查询 MongoDB ObjectId 吗?

    我知道 ObjectId 包含它们的创建日期 有没有办法查询ObjectId的这方面 将时间戳弹出到 ObjectId 中 http www kchodorow com blog 2011 12 20 querying for timest
  • MongoDB C# 驱动程序“找不到光标”

    我有一个相当密集的操作MongoCursor循环运行几个小时 在通过 c 驱动程序运行的 vb net 应用程序上 我不太确定是什么导致了它 但一段时间后我遇到了异常 Cursor not found 这可能是由于游标超时造成的 有什么办法
  • 将字符串数组转换为对象 Id 数组

    我有一个字符串数组 let stringObjectIdArray fssdlfsd343 43434234242 342424242 我想使用 mongoose 类型将字符串数组更改为对象 Id 数组 但它不起作用 它仅适用于字符串而不是
  • Inno Setup安装先决条件[重复]

    这个问题在这里已经有答案了 我正在通过 Inno Setup 创建一个安装程序 我看到很多关于如何检测先决条件是否存在的代码示例 但没有任何关于当我找不到先决条件时如何实际安装先决条件的代码示例 我确信它非常简单 但是我该如何安装先决条件呢
  • 重命名 MongoDB 数组中嵌入文档中的字段不起作用

    Step One gt db myCollection find id ObjectId 2358523892345 field1 value 1 field2 subfield1 value 2 Subfield2 value 3 fie
  • 在 Windows 7 - 64 位上安装 Mongodb

    我是 mongodb 的新手 不知道如何安装它 因为我找不到视频或任何有用的资源来实现相同的目的 请帮助我在 Windows 7 上安装 mongodb 并提供确切的步骤 我尝试从该网站下载最新版本的 mongodb 但不成功 提前致谢 R
  • $lookup结果中的$match

    我有下一个蒙戈代码 db users aggregate match and UserName eq administrator Company CompanyName eq test lookup from companies local
  • MongoDB $orderby 和 Sort 之间的区别

    我想获取最新的文档 这显然是一个文档 因此findOne应该可以正常工作 但findOne这里返回插入的第一个文档 所以我现在有两个选择要么使用 orderBy with findOne or use sort 功能与 limit in f
  • mongo objectid“包含”查询

    我想查询 MongoDB 数据库中的集合以查找包含部分 ObjectID 的所有记录 对于普通字符串 我可以使用如下正则表达式 db teams find some string 51eed 但是我该如何对 ObjectID 执行类似的操作
  • Mongodb聚合数组大小大于匹配项[重复]

    这个问题在这里已经有答案了 我有一个集合 其中投资是 mongodb 文档内的一个数组 现在使用聚合 我尝试过滤投资长度超过 5 倍的结果 然后使用匹配查询进行下一步处理 Collection id 000000 investments h
  • MONGODB [DEBUG] 游标的cursor.refresh() 7078636577051629992

    更新大型 json 列表时 出现以下错误 2012 04 01T09 34 00 00 00 app run 1 MONGODB DEBUG cursor refresh for cursor 7078636577051629992 201
  • node-mongodb-native的插入性能

    我正在使用 MongoDB 测试 Node js 的性能 我知道其中每一个都很好 彼此独立 但我正在尝试一些测试来感受它们 我遇到了这个问题 但无法确定来源 问题 我正在尝试在单个 Node js 程序中插入 1 000 000 条记录 它
  • Strapi 未加载 Digital Ocean 上托管的现有 MongoDB 中的集合

    我正在使用 Strapi 创建一个新应用程序 并尝试将其与托管在 Digital Ocean 上的 MongoDB 连接 但不幸的是Strapi 无法从现有 MongoDB 获取集合 在这里 我提到我实现 Strapi 与现有 MongoD
  • 未找到“MongoId”类(带有 MongoDB Doctrine 的 Zend 框架)

    我目前正在尝试将 MongoDB 与 ZendFramework 中的 Doctrine 集成 我做了很多教程 在 StackOverflow 或其他地方 但没有任何效果 我一步步按照教程进行操作 http www bigwisu com
  • 查询 MongoDB 集合中的字段。

    我正在尝试查询 mongodb 集合中的特定字段 这是我的代码和输出 Mongo m new Mongo DB db m getDB mydb DBCollection coll db getCollection student addin
  • Mongodb 数据建模/投票更新(向上和向下)

    Mongo 中有一个关于投票数据模型 更新查询的示例 http www mongodb org display DOCS MongoDB Data Modeling and Rails MongoDBDataModelingandRails
  • ReferenceError:MongoDB shell 中未定义 require

    我尝试通过 Windows 命令 Windows 8 1 从 Mongo 客户端连接 MongoDB 当我使用require 在 javascript 中 我遇到如下错误 有人有同样的问题吗 我有错过任何一个吗require有关的npm安装

随机推荐

  • 更改 Materialise 框架中复选框的颜色

    我目前正在使用 Materialise 框架 想知道是否可以更改填充复选框的颜色 因为它默认为绿色
  • Thrift 有 IPC 传输实现吗?或低延迟 SOA 解决方案

    我想将 SOA 引入低延迟系统 而无需 TCP 通信的开销 即使在同一台机器上 Thirft 似乎非常适合我 因为我同时拥有 Java 和 php 进程 是否有针对节俭的 IPC 传输实现 或者任何其他可以在这种情况下提供帮助的好主意 您可
  • “复制捆绑资源”中缺少故事板

    I m using base internationalization to internationalize my app Once I used it my storyboards became red in copy bundle r
  • 将 Plist 数据显示到 UItableview 中

    我有一个包含字典和每个字典的字符串数量的 plist 显示到下面的 url 中 plist 中的项目列表有数千个 我需要将这些 plist 数据显示到 UItableview 中 这个怎么做 My Code void viewWillApp
  • 如何使用纯javascript读取图像文件?

    我是 javascript 新手 目前我的一个项目遇到问题 其中包括从网站根文件夹查看图像 这是我当前的代码 var reader new FileReader reader onload function event var dataUr
  • 如何在 ColdFusion ORM 中深度克隆持久实体?

    我有一个持久实体用作模板 Company Locations Departments Employees 换句话说 一个Company包含许多Locations 其中包含许多Departments 其中包含许多Employees 我有一个C
  • TransactionRequiredException 执行更新/删除查询

    我将 hibernate JPA 与 spring 和 mongodb 结合使用 并在 Glassfish 4 0 上运行我的应用程序 我的服务等级是 Component public class Test PersistenceConte
  • 仅删除单个方法的 csrf 令牌 - Laravel

    我正在使用 paytabs 支付网关 api 在该 api 中 必须给出重定向 url 以便一旦交易完成 页面将自动重定向到您给定的重定向 url 该 url 是 GET url 但由于 api 的响应是 POST 类型 因此我无法使用 g
  • 如何修复“kex_exchange_identification:读取:对等方重置连接”?

    我想复制数据scp在使用 PRIVATE KEY 的 GitLab 管道中 错误是 kex exchange identification read Connection reset by peer Connection reset by
  • Android中SAX解析问题

    您好 我有一个 Android 应用程序 我想从 xml 文件获取数据 我已经使用了 SAX 解析器 但是从这里给出的这种类型的 xml 文件获取数据存在一些问题 所以请给我解决方案 使用SAX解析来解析以下xml文件 我的 xml 文件在
  • 基于查找 df 中其他两列之间最接近的值返回值

    我的问题几乎相同this one https stackoverflow com questions 41496276 return rows establishing a closest value to in r除非不是寻找列值和固定数
  • 写入 VpnService 输出流没有响应

    我的应用程序实现 VpnService 来拦截网络流量并提供量身定制的响应 目标是处理特定地址的流量 并丢弃其他请求 目前 我成功解析传入请求并构建和发送响应 然而 问题在于这些响应并不是作为对原始请求的实际响应而到达的 使用套接字连接进行
  • GridBagLayout 如何将组件向北推

    这是我的代码 public class HomeTopPanel extends JPanel BUTTONS private final JButton myAccountButton new JButton My Account pri
  • java.lang.NoSuchMethodError: org.mockito.Answers.get()Lorg/mockito/stubbing/Answer;

    我正在尝试将 spring boot 版本从 2 2 4 升级到 2 6 6 我能够成功编译应用程序并且能够启动应用程序 但是当我尝试运行测试时 所有测试都因一个错误而失败 java lang NoSuchMethodError org m
  • 在 Threejs 中使用鼠标滚轮更改相机位置.z

    有谁知道如何改变camera position z 用鼠标滚轮 相机 并制作滚动效果 当我尝试使用变量时 它不起作用 TrackballControls or OrbitControls示例中可以使用启用缩放 以及旋转和平移 参见示例htt
  • matplotlib 复制图形并应用更改

    我正在制作一系列具有相同布局的人物 由于布局需要多行代码 我试图复制第一次完成的代码 只更改一些内容 例如标记 如果可能的话 数据虽然我知道它可能会使事情变得复杂 因为它可能需要重新缩放和这样在 plt show 命令结束时 就会显示原始图
  • 进行预测时 conv2d_transpose 取决于 batch_size

    我目前有一个在张量流中实现的神经网络 但我在训练后进行预测时遇到问题 因为我有 conv2d transpose 操作 并且这些操作的形状取决于批量大小 我有一个需要 output shape 作为参数的层 def deconvLayer
  • 带计时器的 .NET Windows 服务停止响应

    我有一个用 C 编写的 Windows 服务 它内部有一个计时器 可以定期触发一些功能 所以我的服务的骨架 public partial class ArchiveService ServiceBase Timer tickTack int
  • 传播 Bash shell 脚本中的所有参数

    我正在编写一个非常简单的脚本来调用另一个脚本 并且我需要将参数从当前脚本传播到我正在执行的脚本 例如 我的脚本名称是foo sh并打电话bar sh foo sh bar 1 2 3 4 在不明确指定每个参数的情况下如何做到这一点 Use
  • 使用另一个字段的值更新 MongoDB 字段

    在 MongoDB 中 是否可以使用另一个字段的值来更新一个字段的值 等效的 SQL 类似于 UPDATE Person SET Name FirstName LastName MongoDB 伪代码是 db person update s