Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Mongodb和object在数组中混在一起

Mongodb和object在数组中混在一起
EN

Stack Overflow用户
提问于 2021-09-23 08:32:45
回答 1查看 94关注 0票数 1

我在mongodb中有下面的文档,其中等级键是一个包含对象和数组组合的数组。我的数据库里有几张这样的记录。我希望更新数组,并将其作为所有此类记录的对象。如何通过更新查询实现这一点?

代码语言:javascript
运行
AI代码解释
复制
 {
        _id: 4,
        grades: [
           { grade: 80, mean: 75, std: 8 },
           { grade: 85, mean: 90, std: 5 },
           [{ grade: 85, mean: 85, std: 8 }]
        ]
      }

预期产出:

代码语言:javascript
运行
AI代码解释
复制
 {
        _id: 4,
        grades: [
           { grade: 80, mean: 75, std: 8 },
           { grade: 85, mean: 90, std: 5 },
           { grade: 85, mean: 85, std: 8 }
        ]
      }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-23 08:51:50

MongoDB 3.4中使用单个更新查询无法做到这一点,

1)您可以在循环中执行2次查询(首先查找和第二次更新),可以在mongo或任何MongoDB编辑器中执行:

  • 需要字段并循环结果的find()查询
  • for循环grades数组
  • 检查级别元素是否为数组,然后连接,否则返回相同的条件。
  • 更新新的update()数组的grades查询
代码语言:javascript
运行
AI代码解释
复制
db.getCollection('grades').find({}, { grades: 1 }).forEach(function (doc) {
    var grades = [];
    for(var i = 0; i < doc.grades.length; i++) {
        if (Array.isArray(doc.grades[i])) {
            grades = grades.concat(doc.grades[i]);
        }
        else {
            grades.push(doc.grades[i]);
        }
    }
    // update
    db.getCollection('grades').update(
        { _id: doc._id }, 
        { $set: { grades: grades } }
    )
})

2)您可以尝试使用单个查询在新集合中尝试聚合查询和导出更新的结果,

  • $reduce迭代grades数组的循环
  • 获取元素的数据类型的$type
  • $concatArrays连接多个数组
  • 如果元素类型为数组,则$cond检查条件,然后将两个数组直接连接,否则将与数组连接到数组中。
  • $out导出新集合中的集合
代码语言:javascript
运行
AI代码解释
复制
db.collection.aggregate([
  {
    $addFields: {
      grades: {
        $reduce: {
          input: "$grades",
          initialValue: [],
          in: {
            $cond: [
              { $eq: [{ $type: "$$this" }, "array"] },
              { $concatArrays: ["$$value", "$$this"] },
              { $concatArrays: ["$$value", ["$$this"]] }
            ]
          }
        }
      }
    }
  },
  { $out: "collection name" }
])

游乐场

3)在使用聚合管道进行更新 4.2上使用MongoDB query 的备用选项,

代码语言:javascript
运行
AI代码解释
复制
db.collection.updateMany({},
  [{
    $set: {
      grades: {
        $reduce: {
          input: "$grades",
          initialValue: [],
          in: {
            $cond: [
              { $eq: [{ $type: "$$this" }, "array"] },
              { $concatArrays: ["$$value", "$$this"] },
              { $concatArrays: ["$$value", ["$$this"]] }
            ]
          }
        }
      }
    }
  }]
)

游乐场

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69303806

复制
相关文章
安卓Android自定义dialog对话框确认取消按钮
实例为2个按钮 - 按需求自行添加按钮 示例图片: 示例代码: public void isHan() { AlertDialog.Builder builder=new AlertDialog.Builder(this); builder.setTitle("小韩提示"); builder.setIcon(android.R.drawable.ic_dialog_info); builder.setPositiveButton("确定",
骤雨重山
2022/01/17
2.4K0
安卓Android自定义dialog对话框确认取消按钮
如何在调用WCF服务之前弹出一个确认对话框?
昨天有人在微博上问我如下一个问题: 老蒋,客户端调用wcf的一个接口函数时,有没有什么办法可以先弹出一个确认框,确认后再执行调用。因为这个接口函数再很多地方都执行了调用,所以我想在某个入口进行统一地
蒋金楠
2018/01/15
1.3K0
如何在调用WCF服务之前弹出一个确认对话框?
Selenium系列(九) - 针对alert窗口的处理(警告框、确认框、对话框)和源码解读
https://www.cnblogs.com/poloyy/category/1680176.html
小菠萝测试笔记
2020/06/09
1.8K0
Selenium系列(九) - 针对alert窗口的处理(警告框、确认框、对话框)和源码解读
【RabbitMq 篇六】-消息确认(发送确认与接收确认)
消息确认是保证消息传递可靠性的重要步骤,上一节我们说到持久化,持久化只能保证消息不丢失,但是如果消息如果投递失败我们怎么进行补偿操作呢?解决办法就是实现回调函数进行操作,在消息的发送和消息的消费都可以进行补偿操作,下面我们就要讲解消息确认。
胖虎
2019/06/26
3.5K0
【RabbitMq 篇六】-消息确认(发送确认与接收确认)
kafka的ack确认机制
topic的每个partition收到producer发送的数据后,都需向producer发送ack,如果producer收到ack,就会进行下一轮的发送,否则重新发送。
CoreDao
2021/04/12
2.7K0
kafka的ack确认机制
python生成带有表格的图片
刚开始的思路,是直接生成一个带有table标签的html文件,然后将这个文件转成图片,经过查找资料发现需要安装webkit2png,而这个库又依赖其他的东西,遂放弃。
py3study
2020/01/07
5.3K0
Tkinter的消息对话框
showinfo, showwarning, showerror, askquestion, askokcancel,askyesno, or askretrycancel
py3study
2020/01/10
1.2K0
对话框
对话框是一个现代GUI应用不可或缺的一部分。对话是两个人之间的交流,对话框就是人与电脑之间的对话。对话框用来输入数据,修改数据,修改应用设置等等。
小飞侠xp
2018/12/24
2.4K0
什么是带有SSCC的DESADV?
在我们开始详细研究DESADV与SSCC之前,首先需要了解背景。近年来,零售业发生了实质性的变化。大多数小型杂货店的市场份额逐渐减少,大型零售商的分店占据了市场。这些小杂货店(也称为便利店)与今天的超市之间的区别是,超级市场提供的商品种类更多,并且供应商需要不断扩充商品种类。
知行软件EDI
2021/04/13
1.4K0
什么是带有SSCC的DESADV?
短代码-带有背景的Toast
这里逐渐收集了本人自己编写的「短代码」和「重复发明轮子(Reinventing the wheel)」。所有的短代码可前往 “时光”-“文章标签”-“短代码” 查看 DiyToast.class - 主要接口 /** * @author Administrator * @year 2019 * @Todo TODO 自定义Toast * @package_name com.example.shengsaidemo2019.toats * @project_name 2019ShengSaiDemo
奶油话梅糖
2021/03/16
1.2K0
构建带有ssh服务的镜像
公司有一批机器是内网的机器,无法访问外网,但是内网之间都是可以互通的,我们需要在这几台机器上部署环境,所以优先考虑使用docker容器,在本地写好dockerfile,构建好镜像,然后把镜像load到目标机器上,所以我们需要先构建一层装有基础服务的镜像,然后在此基础上部署服务。
dogfei
2020/07/31
1.5K0
带有Apache Spark的Lambda架构
市场上的许多玩家已经建立了成功的MapReduce工作流程来每天处理以TB计的历史数据。但是谁愿意等待24小时才能获得最新的分析结果?这篇博文将向您介绍旨在利用批处理和流处理方法的Lambda架构。我们将利用Apache Spark(Core,SQL,Streaming),Apache Parquet,Twitter Stream等实时流数据快速访问历史数据。还包括清晰的代码和直观的演示!
大数据弄潮儿
2018/05/29
2.1K0
带有Apache Spark的Lambda架构
[答疑]收费确认流程
足球fans(584***82) 16:43:02 潘老师,帮我看下我画的一个在系统里已经实现的"收费流程",有什么问题没?
用户6288414
2021/07/14
2.8K0
RabbitMQ发布确认
  生产者将信道设置成 confirm 模式,一旦信道进入 confirm 模式,所有在该信道上面发布的消息都将会被指派一个唯一的 ID(从 1 开始),一旦消息被投递到所有匹配的队列之后,broker就会发送一个确认给生产者(包含消息的唯一 ID),这就使得生产者知道消息已经正确到达目的队列了,如果消息和队列是可持久化的,那么确认消息会在将消息写入磁盘之后发出,broker 回传给生产者的确认消息中 delivery-tag 域包含了确认消息的序列号,此外 broker 也可以设置basic.ack 的 multiple 域,表示到这个序列号之前的所有消息都已经得到了处理。   confirm 模式最大的好处在于他是异步的,一旦发布一条消息,生产者应用程序就可以在等信道返回确认的同时继续发送下一条消息,当消息最终得到确认之后,生产者应用便可以通过回调方法来处理该确认消息,如果 RabbitMQ 因为自身内部错误导致消息丢失,就会发送一条 nack 消息,生产者应用程序同样可以在回调方法中处理该 nack 消息。
别团等shy哥发育
2023/02/25
7050
RabbitMQ发布确认
确认访问用户身份的认证
下次向服务器发 送请求时, 浏览器会自动发送 Cookie, 所以 Session ID 也随之发送到服务器
李才哥
2021/02/21
1.8K0
确认访问用户身份的认证
RabbitMQ发布确认
RabbitMQ的发布确认(Publish Confirm)是一种机制,用于确保消息在发送到RabbitMQ之后被成功接收和持久化。通过使用发布确认,生产者可以获得对消息的可靠性保证,避免消息丢失。
堕落飞鸟
2023/05/16
7030
确认EMIO引脚编号的方法
当我们在Vivado中配置EMIO的时候,也并没有指定其编号,只是指定了需要的EMIO的数目,当在SDK中编程使用时,EMIO的编号永远就是从78开始数,如果上面指定的位宽是2,则编号是78,79;位宽是4,则是78,79,80,81。这其实也说明vivado会自动从Bank3 LSB开始给我们分配引脚。
黑马Amos
2023/03/21
8490
确认EMIO引脚编号的方法
JavaScript对话框
在JavaScript中,我们可以使用window对象中的alert()方法来弹出一个提示框。该对话框效果如下:
Qwe7
2022/04/09
1.8K0
MQ发布确认
  生产者将信道设置成confirm模式,一旦信道进入confirm模式,所有在该信道上面发布的消息都将会被指派一个唯一的ID(从1开始),一旦消息被投递到所有匹配的队列之后,broker就会发送一个确认给生产者(包含消息的唯一ID),这就使得生产者知道消息已经正确到达目的队列了,如果消息和队列是可持久化的,那么确认消息会在将消息写入磁盘之后发出,broker回传给生产者的确认消息中delivery-tag域包含了确认消息的序列号,此外broker也可以设置basic.ack的multiple域,表示到这个序列号之前的所有消息都已经得到了处理。
一个风轻云淡
2022/11/13
1.2K0
MQ发布确认
使用带有MySQL Router的Replica Set
您可以使用MySQL Router 8.0.19和更高版本对replica set进行引导,就像可以引导InnoDB cluster一样,将MySQL路由器与InnoDB Cluster结合使用”。生成的MySQL路由器配置文件的唯一区别是添加了cluster_type选项。将MySQL路由器引导到副本集时,生成的配置文件包括:
卖菜小弟
2020/01/22
2.1K0

相似问题

带有确认对话框的函数

10

带有确认对话框的Actionlink

30

带有确认对话框的JFileChooser

54

带有确认的jQuery UI对话框

32

带有确认按钮的Dojo对话框

40
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档