更新 mongo 中的字段类型

2024-03-12

我有大量记录collection:

{field: [value]}

我怎样才能有效地更新到:

{字段:值}

我尝试过这样的事情:(pymongo 语法)

collection.update({"field.1": {"$exists": True}},
                  {"$set": {'field': "field.1"}},
                  multi=True)

这显然不起作用。 由于记录数量很大,因此不能选择循环遍历每个记录并删除-插入。


您需要循环光标并使用$set更新运算符。当然,要做到这一点,您可以使用“批量”操作来实现最大效率。话虽这么说,该方法会根据您的 MongoDB 服务器版本和 PyMongo 版本而有所不同。

从 MongoDB 3.2 开始,您需要使用批量写操作 https://docs.mongodb.org/manual/core/bulk-write-operations/#bulk-write-operationsbulkWrite() https://docs.mongodb.org/manual/reference/method/db.collection.bulkWrite/#db.collection.bulkWrite method.

var requests = [];
var cursor = db.collection.find( { "field.1": { "$exists": true } }, { "field": 1 } );
cursor.forEach( document => { 
    requests.push({ 
        "updateOne": {
            "filter" : { "_id": document._id },
            "update" : { "field": { "$set": document.field[0] } }
        }
    });
    if (requests.length === 1000) {
        db.collection.bulkWrite(requests);
        requests = [];
    }
});

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

此查询使用 PyMongo 3.0 驱动程序,它提供了您需要使用的bulk_write() https://api.mongodb.org/python/current/api/pymongo/collection.html#pymongo.collection.Collection.bulk_write方法给出以下内容:

from pymongo import UpdateOne


requests = [];
cursor = db.collection.find({"field.1": {"$exists": True}}, {"field": 1})
for document in cursor:
    requests.append(UpdateOne({'_id': document['_id']}, {'$set': {'field': document['field'][0]}}))
    if len(requests) == 1000:
        # Execute per 1000 operations
        db.collection.bulk_write(requests)
        requests = []
if len(requests) > 0:

    # clean up queues
    db.collection.bulk_write(requests)

从 MongoDB 2.6 开始,您需要使用现已弃用的Bulk https://docs.mongodb.org/manual/reference/method/Bulk/#bulk API.

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

// cursor is the same as in the previous version using MongoDB 3.2
cursor.forEach(function(document) { 
    bulk.find( { "_id": document._id } ).updateOne( { "$set": { "field": document.field[0] } } ); 
    count++;
    if (count % 1000 === 0) {
        bulk.execute();
        bulk = db.collection.initializedUnorderedBulkOp();
    }
});

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

翻译成Python给出以下内容。

bulk = db.collection.initialize_unordered_bulk_op()
count = 0

for doc in cursor:
    bulk.find({'_id': doc['_id']}).update_one({'$set': {'field': doc['field'][0]}})
    count = count + 1
    if count == 1000:
        bulk.execute()
        bulk = db.collection.initialize_unordered_bulk_op()

if count > 0:
    bulk.execute()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

更新 mongo 中的字段类型 的相关文章

随机推荐

  • 将 MySQL 服务器连接到 NetBeans

    我正在尝试在 Netbeans 中连接 MySQL 数据库 但停留在第一步 连接数据库 我的数据库在控制台上工作正常 尝试命令 mysqladmin u root p ping 它说 mysql id 还活着 我什至从控制台创建了数据库 现
  • 从 3D 平面到平行于图像平面的平面的单应性

    我有一张图像 其中场景中有一个校准目标 已知几何形状 假设桌子上有一个简单的 2 x 2 正方形 我想执行透视变换 使用warpPerspective 以便生成的图像是桌子的正交视图 就好像相机轴与桌子法线平行 计算单应性的标准过程是从一个
  • 从字符串中删除每个第 n 个元素

    如何删除字符串中的每第 n 个元素 我猜你会使用drop以某种方式发挥作用 就像这样删除第一个 n 你怎么能改变它 只删除第 n 个 然后是后面的第 n 个 依此类推 而不是全部 dropthem n xs drop n xs 简单的 取
  • 脚本在 上时不起作用

    我证明了剧本 它的作品 但在 我不擅长剧本 也许这是一个简单的问题 基本上 脚本只是显示 当鼠标悬停在图像上时 img1 mouseover functi
  • 字节顺序、“最高有效”和“最低有效”

    我在网上阅读了描述大端和小端的描述 然而 它们似乎基本上都以相同的方式读取 我仍然对 最多 和 最少 有效字节的实际实现感到困惑 据我了解 小端值首先评估 最低有效 值 而在大端值下 首先评估 最高有效 字节 但是 我不清楚 最 和 最不
  • 为什么类不能用作模块?

    Module是的超类Class Class superclass gt Module 在面向对象编程中 这意味着Class可以在任何有实例的地方使用Module可以使用 令人惊讶的是 情况并非如此ClassRuby 中的实例 class C
  • 使用字符串键访问或创建嵌套 JavaScript 对象而不使用 eval

    我正在寻找一个很好的解决方案来通过字符串值访问属性 但如果该属性不存在 则应该创建它 如果根结构已经定义了该结构的某些部分 则不应覆盖这些属性 而应合并这些属性 例如 如果您有一个空对象test并且您想在不使用 eval 的情况下设置深层结
  • 如何用
    $...$
    替换 LaTeX $...$ 和 $$...$$ 符号?

    我目前遇到的问题是 Jekyll 不能很好地与 Markdown 和 LaTeX 配合使用 所以我有很多文章 frac some latex or int e v en more 我该如何更换 by span span and by div
  • 匹配 ggplot2 中的图例项和颜色,其中某些 geom_segment 未包含在图例中

    我似乎无法让我的图例标签和颜色在 ggplot2 中正确匹配 我有一些 geom segments 我不想包含在图例中 我尝试了各种选择 但没有一个有效 现有的问题似乎都没有涉及未在绘图上标记某些元素的问题 所以这可能会增加复杂性 代码如下
  • 具有来自同一个表的 2 个外键的 Django 模型

    我想要一个带有来自同一个表的 2 个外键的 Django 模型 这是一个事件表 有两列员工 参与者 和 接收者 但我收到这个错误 错误 一个或多个模型未验证 tasks task 中介 模型 TaskEvent 有多个 Employee 外
  • Tcl.h:没有这样的文件或目录

    我正在尝试将一些代码从 Solaris 机器移植到 Linux 特别是 Redhat 机器上 代码编译没有问题 并且在 Solaris 机器上运行也没有问题 然而 在 Linux 上重新编译时 我遇到了 tcl h 的问题 编译器告诉我 e
  • JCL TEvaluator 类中预定义了哪些函数

    有谁知道其中包含哪些预定义功能 例如 ABS 功能 TEvaluatorDelphi 7 的 JCL 类 没有任何标准功能Math pas包括 默认评估解析器中实现的所有内容都是运算符or xor and not mod lt gt lt
  • 使用 python 3 抓取需要登录的网站

    只是一个关于一些抓取身份验证的问题 使用BeautifulSoup importing the requests lib import requests from bs4 import BeautifulSoup specifying th
  • 如何通过CSS将鼠标悬停在导航菜单上来隐藏和显示Bootstrap 4卡片?

    您好 我试图通过将鼠标悬停在菜单列表上来显示和隐藏卡片的特定部分 我可以使用 css 隐藏卡片 但无法通过特定类的 css 的 display block 属性来显示它 HTML 导航菜单 div class d flex justify
  • ctags 和 Fortran 的接口

    我想知道如何让 ctags 使用 Fortran 中的接口 例如 INTERFACE SOME ROUTINE MODULE SOME ROUTINE A MODULE SOME ROUTINE B END SOME ROUTINE 因此
  • 将数据从钩子传递到 codeigniter 中的视图

    我可以将数据从钩子传递到视图吗 如果可能 请解释一下 例如 hook post controller constructor array class gt Varify user function gt user project filen
  • NUnit Assert.Equals 我错过了什么?

    Assert Equals 从不调用 Equals operator operator 我错过了什么吗 我已经实现了 IEquatable 但在使用 nunit 时仍然从未调用这些方法 if objectA objectB Assert F
  • 为什么 C++17 结构化绑定不使用 { }?

    我找到了 C 结构化绑定的原始提案here http www open std org jtc1 sc22 wg21 docs papers 2015 p0144r0 pdf 它提出了一种轻松绑定多个返回值的方法 即 auto a b mi
  • asp .net 验证在 IE 10 中不起作用

    有人遇到过这个问题吗 我需要对一个表单进行字段验证 我已经测试过该表单 并且知道它可以在 IE 7 9 Firefox 和 Chrome 中工作 但在 IE 10 中 它允许在不进行任何验证的情况下提交表单 该网站采用 Net 3 5 我在
  • 更新 mongo 中的字段类型

    我有大量记录collection field value 我怎样才能有效地更新到 字段 值 我尝试过这样的事情 pymongo 语法 collection update field 1 exists True set field field