MongoDB - 使用 update_many() 同时更新不同的数组

2023-12-05

首先,一些背景知识。
我在 Python 中有一个函数,它查询外部 API 来检索与 ID 相关的一些信息。此类函数将 ID 作为参数,并返回数字列表(它们对应于与此类 ID 关联的某些元数据)。
例如,让我们在这样的函数中引入ID{0001, 0002, 0003}。假设该函数为每个 ID 返回以下数组:

0001 → [45,70,20]  
0002 → [20,10,30,45]  
0003 → [10,45]

我的目标是实现一个按如下方式构造数据的集合:

{
    "_id":45,
    "list":[0001,0002,0003]
},
{
    "_id":70,
    "list":[0001]
},
{
    "_id":20,
    "list":[0001,0002]
},
{
    "_id":10,
    "list":[0002,0003]
},
{
    "_id":30,
    "list":[0002]
}

可以看出,我希望我的集合通过元数据本身来索引信息。使用此结构,$_id“45”的文档包含一个列表,其中包含与元数据 45 相关联的所有 ID。这样,我可以通过对集合的单个请求来检索映射到特定元数据值的所有 ID。
负责在集合中插入 ID 和元数据的类方法如下:

def add_entries(self,id,metadataVector):
    start = time.time()
    id=int(id)
    
    for data in metadataVector:
        self.SegmentDB.update_one(
            filter = {"_id":data},
            update = {"$addToSet":{"list":id}},
            upsert = True
        )


    end = time.time()
    duration = end-start
    return duration

元数据向量是包含与给定 ID 关联的所有元数据(整数)的列表(即:[45,70,20]).
id是与metadataVector 中的元数据关联的ID。 (即:0001)。
此方法当前遍历列表并对列表中的每个元素(每个元数据)执行操作。此方法实现了我想要的集合:它更新“_id”是给定元数据的文档,并将源自此类元数据的 ID 添加到其相应的列表中(如果此类文档尚不存在,则会插入它 - 这就是 upsert = true 代表全部)。
然而,从长远来看,这种实现最终会有些缓慢。元数据向量通常每个 ID 有大约 1000-3000 个项目(元信息整数,范围在 800 - 23000000 之间),我有大约 40000 个 ID 需要分析。因此,馆藏数量迅速增长。目前,我的集合中有大约 320 万个文档(一个专门用于每个单独的元数据整数)。我想实施一个更快的解决方案;如果可能的话,我想将所有元数据插入一个唯一的数据库请求中,而不是为每个项目调用更新元数据向量单独。 我尝试了这种方法,但它似乎没有按我的预期工作:

def add_entries(self,id,metadataVector):           
    start = time.time()                        
    id=int(id)                                 
                                                   
    self.SegmentDB.update_many(                
        filter={"_id": {"$in":metadataVector}},
        update={"$addToSet":{"list":id}},      
        upsert = True          
    )                                          
                                                   
        end = time.time()                          
        duration = end-start                       
        return duration

                        

我尝试使用更新多(因为这似乎是解决问题的自然方法)指定一个过滤器,据我了解,该过滤器指出“_id 位于的任何文档元数据向量"。通过这种方式,所有涉及的文档都会将原始 ID 添加到列表中(或者,如果由于更新插入条件而不存在文档,则会创建该文档),但集合最终会被包含在列表和一个 ObjectId() _id。显示最终结果的图片.

有办法实现我想要的吗?我应该以不同的方式重组数据库吗?

预先非常感谢!


这是一个例子,它使用批量写入运营。批量操作将多个插入、更新、删除(可以是组合)作为对数据库的单个调用提交并返回结果。这比多次调用数据库更有效。

场景一:

Input: 3 -> [10, 45]

def some_fn(id):
    # id = 3; and after some process... returns a dictionary
    return { 10: 3, 45: 3, }

场景2:

输入(作为列表):

3 -> [10, 45]
1 -> [45, 70, 20]

def some_fn(ids):
    # ids are 1 and 3; and after some process... returns a dictionary
    return { 10: [ 3 ], 45: [ 3, 1 ], 20: [ 1 ], 70: [ 1 ] }

执行批量写入

现在,使用返回值对数据库执行批量操作some_fn.

data = some_fn(id) # or some_fn(ids)

requests = []
for k, v in data.items():
    op = UpdateOne({ '_id': k }, { '$push': { 'list': { '$each': v }}}, upsert=True)
    requests.append(op)

result = db.collection.bulk_write(requests, ordered=False)

请注意ordered=False- 此选项再次用于获得更好的性能,因为写入可以并行发生。

参考:

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

MongoDB - 使用 update_many() 同时更新不同的数组 的相关文章

  • 使用 python 制作本地服务器应用程序的最佳方法

    我想要简单轻松地集成 python 和 vba 人们 如果他们在阅读本文后亲自见到我 阅读本文可能会杀了我 但我正在使用 django 开发服务器来实现此目的 有没有什么简单又好的方法 仅举个例子 我想使用 python 模块 openpy
  • 将 pandas 数据框中的列减去其第一个值

    我需要将 pandas 数据帧的一列中的所有元素减去其第一个值 在这段代码中 pandas 抱怨 self inferred type 我猜这是循环引用 df Time df Time df Time 0 在这段代码中 pandas 抱怨为
  • 为什么我不能导入 geopandas?

    我唯一的代码行是 import geopandas 它给了我错误 OSError Could not find libspatialindex c library file 以前有人遇到过这个吗 我的脚本运行得很好 直到出现此错误 请注意
  • Python 中的六边形自组织映射

    我在寻找六边形 自组织映射 http en wikipedia org wiki Self organizing map在Python上 准备好模块 如果存在的话 绘制六边形单元格的方法 将六边形单元作为数组或其他方式使用的算法 About
  • 使用正则表达式解析 Snort 警报文件

    我正在尝试使用 Python 中的正则表达式从 snort 警报文件中解析出源 目标 IP 和端口 和时间戳 示例如下 03 09 14 10 43 323717 1 2008015 9 ET MALWARE User Agent Win9
  • 无法包含外部 pandas 文档 Pycharm v--2018.1.2

    我无法包含外部 pandas 文档Pycharm v 2018 1 2 例如 numpy gt http docs scipy org doc numpy reference generated module name element na
  • python中函数变量的作用域

    假设我们有两个函数 def ftpConnect ftp FTP server ftp login ftp cwd path def getFileList ftpConnect files ftp nlst print files 如果我
  • Python:随时接受用户输入

    我正在创建一个可以做很多事情的单元 其中之一是计算机器的周期 虽然我将把它转移到梯形逻辑 CoDeSys 但我首先将我的想法放入 Python 中 我将进行计数 只需一个简单的操作 counter 1 print counter 跟踪我处于
  • Pandas:根据列名进行列的成对乘法

    我有以下数据框 gt gt gt df pd DataFrame ap1 X 1 2 3 4 as1 X 1 2 3 4 ap2 X 2 2 2 2 as2 X 3 3 3 3 gt gt gt df ap1 X as1 X ap2 X a
  • 使用Python将图像转换为十六进制格式

    我的下面有一个jpg文件tmp folder upload path tmp resized test jpg 我一直在使用下面的代码 Method 1 with open upload path rb as image file enco
  • Python While 循环,and (&) 运算符不起作用

    我正在努力寻找最大公因数 我写了一个糟糕的 运算密集型 算法 它将较低的值减一 使用 检查它是否均匀地划分了分子和分母 如果是 则退出程序 但是 我的 while 循环没有使用 and 运算符 因此一旦分子可整除 它就会停止 即使它不是正确
  • Python unicode 字符代码?

    有没有办法将 Unicode 字符 插入 Python 3 中的字符串 例如 gt gt gt import unicode gt gt gt string This is a full block s unicode charcode U
  • 在 Mac 上安装 Pygame 到 Enthought 构建中

    关于在 Mac 上安装 Pygame 有许多未解答的问题 但我将在这里提出我的具体问题并希望得到答案 我在 Mac 上安装 Pygame 时遇到了难以置信的困难 我使用 Enthought 版本 EPD 7 3 2 32 位 它是我的默认框
  • MongoDB java 驱动程序 3.0 在身份验证时无法捕获异常

    我超级卡住o 0 在尝试通过 Java 驱动程序进行身份验证时 存在捕获异常的问题 正如你可能会看到的Throwable类不工作 private MongoClient mongoClient private MongoDatabase m
  • 如何逐像素绘制正方形(Python,PIL)

    在空白画布上 我想使用 Pillow 逐像素绘制一个正方形 我尝试使用 img putpixel 30 60 155 155 55 绘制一个像素 但它没有执行任何操作 from PIL import Image def newImg img
  • python中的sys.stdin.fileno()是什么

    如果这是非常基本的或之前已经问过的 我很抱歉 我用谷歌搜索但找不到简单且令人满意的解释 我想知道什么sys stdin fileno is 我在代码中看到了它 但不明白它的作用 这是实际的代码块 fileno sys stdin filen
  • 是否可以写一个负的python类型注释

    这可能听起来不合理 但现在我需要否定类型注释 我的意思是这样的 an int Not Iterable a string Iterable 这是因为我为一个函数编写了一个重载 而 mypy 不理解我 我的功能看起来像这样 overload
  • Pandas 在特定列将数据帧拆分为两个数据帧

    I have pandas我组成的 DataFrameconcat 一行由 96 个值组成 我想将 DataFrame 从值 72 中分离出来 这样 一行的前 72 个值存储在 Dataframe1 中 接下来的 24 个值存储在 Data
  • Google App Engine 中的自定义身份验证

    有谁知道或知道我可以在哪里学习如何使用 Python 和 Google App Engine 创建自定义身份验证流程 我不想使用 Google 帐户进行身份验证 并且希望能够创建自己的用户 如果不是专门针对 Google App Engin
  • 如何使用 Django (Python) 登录表单?

    我在 Django 中构建了一个登录表单 现在我遇到了路由问题 当我选择登录按钮时 表单不会发送正确的遮阳篷 我认为前端的表单无法从 查看 py 文件 所以它不会发送任何 awnser 并且登录过程无法工作 该表单是一个简单的静态 html

随机推荐

  • 如何将变量扩展到maven-archetype中的嵌套目录中

    假设我已经设置了groupId to com example and artifactId to fancy project 现在我想创建一个原型 这样在创建时会扩展为以下结构 src main com example fancy proj
  • MVC3 - 如何正确使用@html.checkbox?

    我是 MVC3 的新手 我不知道如何在 MVC 中使用复选框 我的视图中有一堆文本 例如 text1 text2 text3 text4 text5 submitbutton 该文本与任何模型无关 只是纯文本 我想为每个项目放置一个复选框并
  • 具有属性继承的表达式树导致参数异常

    继这篇文章之后 链接文本我正在尝试创建一个引用属性的表达式树 我的代码如下所示 public interface IFoo void X get set public interface IBar IFoo void Y get set p
  • 选择两个日期之间的记录

    我有以下查询 SELECT dm app id apt app name COUNT dm app id FROM dm openapp dm JOIN app table apt ON dm app id apt app id GROUP
  • SUMIF 包含数组中的元素之一 (OR)

    我有一个付款列表 我想总结其描述等于我的数组中的元素之一的成本 EMTE 120 00 Bread 35 24 Lidl 0 89 Plus 5 19 Aldi 2 29 Jumbo 4 70 所以用一个数组 Lidl Aldi 它会给我总
  • 当鼠标悬停在文本中的单词上时显示警报

    我已经为此苦苦挣扎了几天 我需要有人引导我走向正确的方向 我一直在网上搜索 我不确定我是否采取了正确的方法 我需要的是 每次有人将鼠标悬停在特定关键字上时 它都应该显示一个警报框 在这个例子中 这个词是 else 当我运行代码时 它不会给出
  • 如何在 Heroku 上使用本地 gem?

    我的 RoR 应用程序上有 gem 声明性授权的修改版本 它位于vendor gems declarative authorization下 我的 gemfile 有 gem declarative authorization 0 5 5
  • 如何在 Javascript 中使用递归函数时读取对象的属性?

    我想知道是否有人能指出我在这方面的正确方向 当我有一个对象时 我通常通过 FOR IN LOOP 读取它的属性 因为我知道属性是什么 因为我创建了这个对象 所以我知道键及其值是什么 我想知道是否还有其他方法 例如递归方法 来读取对象及其属性
  • 将字符串百分比转换为浮点数的干净方法是什么?

    我查看了标准库和 StackOverflow 但没有找到类似的问题 那么 有没有办法在不滚动我自己的函数的情况下执行以下操作 如果有人在没有内置方法的情况下编写出漂亮的函数 则会获得奖励积分 def stringPercentToFloat
  • 给Redis缓存添加过期时间

    我在我的 C 项目中实现了 Redis 缓存 我只是想知道如何才能超载Get
  • node.js 使 HTTP 服务器的请求和响应全局化?

    我刚刚开始使用 Node js 并运行了http nodebeginner org index html 很棒的入门教程 但我真的想知道是否可以将请求和响应设置为 全局 以便为当前传入请求加载的任何模块都可以访问这些 而不是注入 Ideas
  • 如何使用一个输入控件应用多个 ng-pattern

    我正在尝试使用 Angularjs 验证文本框中的邮政编码和电话号码 但这不起作用
  • 如何将 ImageSource 转换为 byte[] 并返回 ImageSource?

    我需要从用户那里获得图像文件路径并将图像存储在我的 SQL Server 数据库中 我从用户那里获取文件并使用该方法转换为 byte public static byte ImageToByteArray BitmapSource bitm
  • 在网站和虚拟目录之间混合 .NET 版本以及“服务器应用程序不可用”错误消息

    背景故事上个月 我们的开发团队创建了一个新的 asp net 3 5 应用程序 并将其发布在我们的生产网站上 工作完成后 我们请求服务器管理组将应用程序复制到我们的生产站点 并将虚拟目录配置为新应用程序 2010 年 12 月 27 日 两
  • Tombstone 与 Nodetool 和修复

    我在 Cassandra 的表中插入了 10K 条目 该表在单个分区下的 TTL 为 1 分钟 成功插入后 我尝试从单个分区读取所有数据 但它抛出如下错误 WARN ReadStage 2 2018 04 04 11 39 44 833 R
  • 在 Windows 上运行 Apache Hadoop 2.1.0

    我是 Hadoop 新手 在尝试在 Windows 7 计算机上运行它时遇到了问题 我特别感兴趣的是运行 Hadoop 2 1 0 作为其发行说明提到支持在 Windows 上运行 我知道我可以尝试使用 Cygwin 在 Windows 上
  • 使用 mechanize 和 Python 2.6 下载 HTML 的编码问题

    browser mechanize Browser page browser open url html page get data print html 它显示了一些奇怪的字符 我认为它是 UTF 8 字符串 但 Python 不知道这一
  • @ModelAttribute 和抽象类

    我知道也有过类似的问题 其中给出的例子过于零散且不清楚 我需要通过发送 POST 的页面上的表单来编辑实体 标准方法是控制器中使用带 ModelAttribute 的参数和验证器的方法 如果一种形式服务于抽象类的某个子类 则生成必要字段没有
  • 从 C# 中的未知类型进行转换

    我有一个对象 其中包含字符串中的值和字段中的原始类型 class myclass public string value public Type type myclass s new myclass s value 10 s type ty
  • MongoDB - 使用 update_many() 同时更新不同的数组

    首先 一些背景知识 我在 Python 中有一个函数 它查询外部 API 来检索与 ID 相关的一些信息 此类函数将 ID 作为参数 并返回数字列表 它们对应于与此类 ID 关联的某些元数据 例如 让我们在这样的函数中引入ID 0001 0