MongoDB,有条件的更新插入或更新

2024-01-01

使用 MongoDB 时,我目前正在表单上进行条件更新插入,作为聚合过程的一部分(简化了很多):

db.dbname.update({attr1 : value1, attr2 : value2},
                 {"$inc" : { avg : current_value, nr : 1}},
                 false (multi), true (upsert))

但我希望能够保留最大值(和最小值),而不必检索文档。大致如下:

db.dbname.update({ attr1 : value1, attr2 : value2},
                 {"$inc" : { avg : current_value, nr : 1},
                  "$setIfBigger" : { max : current_value}},
                 false (multi), true (upsert))

这可以以有效的方式实现吗?

我当前效率极低的解决方案是检查当前聚合文档,如果存在,则相应地更新值,如果不存在,则创建一个新文档。示例(同样,简化了很多,但本质就在那里):

var obj = db.dbname.findOne({attr1 : value1, attr2 : value2},{_id:1});
if (obj != null) {
   db.dbname.update({attr1 : value1, attr2 : value2},
                    {"$inc" : { avg : current_value, nr : 1},
                     "$set" : { max : (obj.max > current_value ? obj.max : current_value}},
                    false (multi), true (upsert));
} else {
   db.dbname.save({attr1 : value1, attr2 : value2, 
                   avg : current_value, nr : 1,
                   max : current_value});
}

实际的程序是用Java编写的,并使用mongo-API,聚合过程非常复杂,并且使用超越Javascript的组合技术与其他服务器通信,因此mapreduce不是一个选择。最后的最终结果是一组巨大的简单值,我想以最有效的方式存储它们,并存储预先计算的平均值、某些组合的最大值和最小值。

一种解决方案是在 JS 中为每次更新创建唯一的函数对象,我认为这不是一种有效的方法?

主要目标是减少执行此类聚合所需的时间,带宽使用是次要的。


现在,在 MongoDB 2.6 版本中可以更轻松地完成此操作,其中包括插入和更新改进 http://docs.mongodb.org/manual/release-notes/2.6/#insert-and-update-improvements。具体有新$min http://docs.mongodb.org/manual/reference/operator/update/min/#up._S_min and $max http://docs.mongodb.org/manual/reference/operator/update/max/#up._S_max根据指定值和字段当前值的相对大小执行条件更新的运算符。

例如这次更新:

db.scores.update( { _id: 1 }, { $max: { highScore: 950 } } )

如果 950 大于当前值,将有条件地更新指定文档highScore.

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

MongoDB,有条件的更新插入或更新 的相关文章

  • 单击 DIV 时滚动到顶部? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何识别当前打开的每个单独的浏览器窗口?

    如何使用 javascript 唯一地识别当前为所有主要浏览器打开的每个单独的浏览器窗口 让我解释一下我需要了解的内容 并考虑以下场景 我有 3 个当前打开的浏览器窗口 任何现代浏览器 即 Chrome Firefox 等 每个窗口都包含多
  • Javascript 的 toUpperCase() 语言安全吗?

    请问Ja vascript的String原型方法toUpperCase 在每种支持 UTF 8 的语言 字符集中提供自然预期的结果 我尝试过简体中文 韩语 泰米尔语 日语和西里尔语 到目前为止结果似乎是合理的 我可以信赖该方法是语言安全的吗
  • 将 C# 3D 数组移植到 JS 3D 数组

    我开发了一个 C 库 它在 3 个项目中使用 这些项目在特定的代码段中中继 不过 我仍然需要在 javascript 中使用该代码 所以将其导出 问题是 我认为我无法复制同样的逻辑 比如这个问题我想了好几天也没有得出答案 在 C 库中 我有
  • For 循环覆盖 HTML 中的文本

    我的数组称为myEmployees其中有 5 个名字 但当我运行代码时 它只打印出其中的 3 个 我相信这种情况正在发生 因为for脚本中的循环会覆盖它在 HTML 文档中编写的前一行 我怎样才能解决这个问题 年度公告板公告 恭喜泰勒 你在
  • jQuery:在 jQuery 对象中存储附加/额外的数据/信息?

    在 jQuery 对象中存储额外的数据是否可能且明智 现在我有包含一些数据的对象 但这些对象也有该数据的视觉表示 这可行 但我有很多代码来保持它们同步 例如 如果您从 dom 中删除一个对象 我还必须从对象数组中删除相关对象 删除相当简单
  • 单击链接时如何将另一个 JSP 页面注入到

    我在一个JSP页面中有两个不同的部分 其中一个包含链接菜单 单击时 div2 id content 会相应加载不同的页面 我正在做类似的事情 div ul class navbar li a href Login jsp Login a l
  • 多个链接 dc.js 图表的 d3-tooltips

    我正在寻找修改 dc js 的开箱即用工具提示 似乎有一个解决方案使用d3 js 工具提示 https github com Caged d3 tip as in 这个问题 https stackoverflow com questions
  • 如何编写具有依赖状态的 redux 减速器

    我正在开发一个 React Redux 应用程序 它允许将 小部件 添加到页面并在 2D 空间中进行操作 要求可以同时选择和操作多个小部件 我当前状态树的简化版本如下所示 widgets widget 1 x 100 y 200 widge
  • 使用 javascript/jquery 检查 .css 样式表的名称

    我正在尝试为论坛制作一个小 chrome 扩展 但我只希望它在论坛的某个区域中工作 问题是我不能只做 matches subforum 因为该论坛中的线程无法通过 URL 区分它们所在的子论坛 subforum 有自己的 css 样式表 所
  • 重写node.js中其他模块中的函数

    我正在尝试在 Node js 应用程序中使用 nodeunit 存根函数 这是我正在尝试做的事情的简化版本 In lib file js var request require request var myFunc function inp
  • Angular 2.0 路由 - TS 2305 ...没有导出成员“ModulewithProviders”

    我正在关注一个角度2 0教程在 Angular JS 官方上site https angular io docs ts latest tutorial toh pt5 html并在路由练习结束时陷入困境 该代码上次有效 但前几天我点击 np
  • Mongoose:保存时根据父字段值设置子文档字段值

    这几乎肯定在其他地方有所涉及 但是 如果我有一个带有嵌入子文档的单一架构 如下所示 var ChildSchema new Schema name type String trim true user type String trim tr
  • 使用 Firefox 插件发出跨域 ajax 请求

    我对如何在 Firefox 插件中发出跨域 ajax 请求感到有点困惑 LastPass 和 Xmarks 等插件建议你可以做到这一点 但是当我尝试用 google 搜索你是如何做到这一点时 每个人似乎都说你不能 除非用户在 Firefox
  • SVG 沿圆弧添加文本

    我正在尝试绘制 SVG 径向饼图 如下所述 色卡 https stackoverflow com a 18210763 1395178 现在我尝试将文本与圆弧一起添加到每个切片 我试图展示Text 1具有与 M 和 A 值完全相同的 x y
  • 有条件地使用 Node.js 提供两个 React 构建

    我有两个基于设备向客户端提供服务的 React 应用程序 我使用 Node js 和 Express 来实现这一点 我借了static资产处理部分来自这个问题在这里 https stackoverflow com questions 644
  • 将 ERB 与 Handlebars 模板结合使用

    我有一个使用 ajax 创建新标签的模式 它使用 Tags 参数执行 POST 方法 而无需重新充电视图 因此 我希望根据所选的 price type 参数来呈现一个或另一个价格 div 我使用 Handlebars 所以我想这不是 rub
  • System.IndexOutOfRangeException:索引超出了数组的范围[重复]

    这个问题在这里已经有答案了 我正在开发一个 ATM 软件作为家庭作业 我想知道今天处理的交易总量 为此我编写了以下代码 public decimal getDayTransaction int accountid string date s
  • 如何在 jest 中测试调用和应用函数?

    这是我的callnapply js file const callAndApply caller object method nameArg ageArg tShirtSizeArg method call object nameArg a
  • axios在自调用函数内部只调用一次(Internet Explorer)

    我有一个函数每 2 5 秒调用自己一次来检查后台运行的任务 它调用 axiosget如果响应错误 则返回一个 url 如果响应成功 我将停止该函数 这在 Chrome 和 Mozilla 上完美运行 但由于某种原因 它在 IE 版本 11

随机推荐

  • mv 包裹在 shell 脚本中的 if 内

    你怎么做到这一点 我的想法是这样的 另外 我需要使用 fi 并完成吗 或仅其中之一 if mv 1 txt gt 2 txt 0 then echo Success else echo Failure fi done 在 BASH 中只有这
  • 多重返回:哪一个设置最终的返回值?

    鉴于此代码 String test try return 1 finally return 2 语言规范是否定义了调用的返回值test 换句话说 在每个 JVM 中它总是相同的吗 在 Sun JVM 中 返回值是2 但我想确定 这不依赖于虚
  • Dask 连接的简单方法(水平,轴=1,列)

    Action将两个 csv data csv 和 label csv 读取到单个数据帧 df dd read csv data files delimiter header None names x y z intensity r g b
  • 基于另一张工作表中的公式的条件格式

    我有 2 张 Excel 2007 PT PT 表 其中一个 sheet1 有多个要验证的列 另一个 base valid 有 5 列需要验证 我正在尝试使用宏验证 regioes M2 列 Sub Validar Regioes Dim
  • 数据分割时使用 scikit-learn 标准化 PCA

    我有一个后续问题 如何使用 PCA 和 scikit learn 进行标准化 https stackoverflow com questions 25475465 how to normalize with pca and scikit l
  • jest 无法识别 URL 构造函数抛出的 TypeError

    Jest toThrow TypeError 与抛出的 TypeError 不匹配new URL构造函数 这是一个错误还是我做错了什么 笑话版本是29 4 2 测试用例 it throws TypeError when url is inv
  • JavaFX ContextMenu 如何获取单击的对象?

    我正在学习 javafx scene control ContextMenu 现在我面临一个问题 如何从 EventHandler 获取单击的对象 event source 和 event target 都返回 MenuItem 让我用一个
  • 使用 Valgrind 运行时 mmap 返回 EINVAL

    我针对 Valgrind 运行的 mips32 应用程序在 mmap 函数中失败 如果我单独运行它工作正常 但是当我针对 valgrind 运行它时 它每次都会失败并显示 EINVAL void mem uint32 t mmap NULL
  • Write系统调用直接将数据写入磁盘?

    我读过几个问题 here https stackoverflow com questions 1450551 buffered i o vs unbuffered io 与此相关 但我仍然有些困惑 我的理解是 write 系统调用将数据放入
  • lucene如何索引文档?

    我读了一些关于Lucene的文档 我还阅读了此链接中的文档 http lucene sourceforge net talks pisa http lucene sourceforge net talks pisa 我不太明白Lucene是
  • 针对写入量大的 Oracle 应用程序进行优化?

    对于主要写入 更新 Oracle 数据库的应用程序 可以使用哪些有用的 Oracle 优化 这里的一般使用模式不是像大多数情况那样进行网络服务或日志记录 而是保存系统的复杂状态 因此唯一需要读取的时间是系统启动时 之后更新并创建所有方式 因
  • 在 Android 上使用选定的 UID 模拟 NFC 卡

    我想问 2 个关于 NFC 卡模拟的问题 我可以模拟包含我选择的 uid 的 NFC 卡吗 I read HCE https developer android com guide topics connectivity nfc hce h
  • cuda内核调用是同步还是异步

    我读到可以使用内核启动来同步不同的块 即 如果我希望所有块在继续操作 2 之前完成操作 1 我应该将操作 1 放在一个内核中 将操作 2 放在另一个内核中 这样 我就可以实现块之间的全局同步 然而 cuda c 编程指南提到内核调用是异步的
  • 对url中的中文字符进行转义?

    有时 汉字会转义为以下形式 B9 F3 D6 DD C3 A9 CC A8 如何将这些字符转换回 Python 中可读的汉字 您可以使用urllib2 unquote像这样 gt gt gt import urllib2 gt gt gt
  • Spark 中的简单矩阵乘法

    我正在努力处理一些非常基本的 Spark 代码 我想定义一个矩阵x有 2 列 这是我尝试过的 scala gt val s breeze linalg linspace 3 3 5 s breeze linalg DenseVector D
  • 为什么按位“非1”等于-2?

    假设我们有1这个以 2 为基数的数字是 00000000000000000000000000000001 现在我想翻转所有位以获得以下结果 11111111111111111111111111111110 据我所知 解决方案是使用 按位非运
  • 如何在2个线程之间共享变量

    Using Python 2 7 3 on Windows 我如何共享变量num线程之间 这样 之后num是平方的 是打印出来的 我意识到我需要了解线程是如何工作的 但是文档没有太多 而且我在这里也没有找到任何东西 那么 有人可以解释线程如
  • 为什么 NodeJS 比原生 C 快 2 倍?

    为了在工作中进行演示 我想比较 NodeJS 和 C 的性能 这是我写的 Node js for js var d 0 0 start new Date getTime for var i 0 i lt 100000000 i d i gt
  • C标准库中realloc是如何实现的?

    我找不到任何源代码realloc函数 它似乎打破了 C 的基本规则 它不需要重新分配内存的长度 在不知道原始内存长度的情况下如何重新分配内存 我自己如何实现这个功能呢 至少有 3 个考虑因素使得实施变得困难或不可能realloc完全在 用户
  • MongoDB,有条件的更新插入或更新

    使用 MongoDB 时 我目前正在表单上进行条件更新插入 作为聚合过程的一部分 简化了很多 db dbname update attr1 value1 attr2 value2 inc avg current value nr 1 fal