Amp

MongoDB 中有什么简单办法做多字段 join?

守給你的承諾、 提交于 2020-08-14 03:57:06
JOIN 在 SQL 是中很基本的运算,但 MongoDB 却没有直接提供,要用 $lookup 对付,但对多个字段关联时就很麻烦。比如这一段: db.getCollection(‘c1’).aggregate([ { $lookup: { from: “c2”, localField: “user1”, foreignField: “user1”, as: “R” } }, {$unwind :“$R”}, { $project: { user1:1, user2:1, income:1, output:‘$R.output’, mid: {$cond: [ { $eq: [ ‘$user2’, ‘$R.user2’] }, 1, 0 ] } } }, {$match : { “$and”: [ {mid : 1}, {income:{ $gte: 0.30}} ] }} ]) 也就是相当于 SELECT S.* FROM C1 S LEFT JOIN C2 R ON S.user1 =R.user1 AND S.user2 =R.user2 WHERE R.income>0.30 这句简单的 SQL。 因为 $lookup 仅支持单字段条件,多字段关联要用 $unwind 将数据拆分,再用 $project: 获取字段,还要用把关联条件拼到过滤条件,整个过程都很繁琐。

为什么PUSH推送经常要背锅?

无人久伴 提交于 2020-08-14 03:46:28
前言 只有光头才能变强。 文本已收录至我的GitHub精选文章,欢迎Star : https://github.com/ZhongFuCheng3y/3y 自从做了推送以后,每隔一段时间就发现有各大的公司推送事故出现。 你问我做开发的慌不慌, 我当然慌得一批了 。 为什么经常会有推送事故 为什么会经常出现类似的事故呢?我认为最主要的原因是: 预发和线上的环境是同一套 。 众所周知,我们的系统都有几套的环境(比如说本地/线下/预发/线上 环境),其中大多数公司的预发和线上环境数据库是同一套的,只是预发环境调用的是预发环境的接口,线上环境调用的是线上环境的接口而已。 推送这种系统的线上和预发环境其实没多大的区别,因为在底层是调用 外部的接口 来实现发送的,所以预发和线上环境其实调的都是 同一个接口 。 科普一下推送是怎么做的 之前写过一篇关于推送的文章,也算是科普了一把什么是推送消息,有兴趣的同学可以去看看: 三歪带你了解什么是Push消息推送 。这次在上面的文章基础上补全一下。 Push推送消息能够在你手机 闭屏时 (即便你没有打开APP),通过 通知 来给你推送信息,是一种能够 直接触达用户 的消息推送 要给用户下发消息,我们得维护APP 客户端和服务端的「 长连接心跳 」。这个长连接心跳如果由我们自行来维护,难度会很大, 绝大部分的公司不会自建推送服务 。

Hacker News 简讯 2020-07-09

两盒软妹~` 提交于 2020-08-14 03:19:57
更新时间: 2020-07-09 23:02 Decentraleyes – Local CDN Emulation - (decentraleyes.org) 分散-本地CDN仿真 得分:91 | 评论:31 How to track and display profile views on GitHub - (rushter.com) 如何在GitHub上跟踪和显示纵断面图 得分:21 | 评论:5 A Tour of Acme (2012) - (swtch.com) 极致之旅(2012) 得分:31 | 评论:3 Launch HN: Yotta Savings (YC S20) – Behavioral psychology to help people save - (phys.org) 推出HN:Yotta Savings(YC S20)——帮助人们储蓄的行为心理学 得分:40 | 评论:39 Giant clams manipulate light to assist their symbiotic partner - (nicolodavis.com) 巨型蛤蜊操纵光来帮助它们的共生伙伴 得分:18 | 评论:5 Moving from TypeScript to Rust / WebAssembly - (discovermagazine.com)

C++ 之九阴真经之信号与槽

核能气质少年 提交于 2020-08-14 03:12:03
  信号与槽(Signal & Slot) 是 Qt 编程的基础,也是 Qt 的一大创新 ,是 Qt 框架引以为豪的机制之一。 因为有了信号与槽的编程机制,在 Qt 中处理界面各个组件的交互操作时变得更加直观和简单,可以完美的解决界面与实现中间的解耦合操作。 所谓信号槽,实际就是观察者模式。当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal)。这种发出是没有目的的,类似广播。如果有对象对这个信号感兴趣,它就会使用连接(connect)函数,意思是,将想要处理的信号和自己的一个函数(称为槽(slot))绑定来处理这个信号。也就是说,当信号发出时,被连接的槽函数会自动被回调。 但 Qt的信号与槽的实现 不是使用的“标准的” C++ 语言,而是对其进行了一定程度的“扩展” ,是通过 “元对象编译器”实现的。Qt 程序在交由标准编译器编译之前,先要使用 moc 分析 C++ 源文件。如果它发现在一个头文件中包含了宏 Q_OBJECT,则会生成另外一个 C++ 源文件。这个源文件中包含了 Q_OBJECT 宏的实现代码。这个新的文件名字将会是原文件名前面加上 moc_ 构成。这个新的文件同样将进入编译系统,最终被链接到二进制代码中去。因此我们可以知道,这个新的文件不是“替换”掉旧的文件,而是与原文件一起参与编译。另外,我们还可以看出一点,moc

基于华为云IOT及无线RFID技术的智慧仓储解决方案最佳实践系列一

╄→尐↘猪︶ㄣ 提交于 2020-08-14 02:45:20
【摘要】仓储管理存在四大细分场景:出入库管理、盘点、分拣和货物跟踪。本系列将介绍利用华为云IOT全栈云服务,端侧采用华为收发分离式RFID解决方案,打造端到端到IOT智慧仓储解决方案的最佳实践。 仓储是什么? 仓储,是物流生命周期很重要的一部分,首先了解什么物流。 物流,顾名思义“物的流通”,指从物品的供应地向接收地流通,是一个根据实际需要,将运输、核算、储存、装卸搬运、包装、流通加工、配送、信息处理等功能有机结合起来实现用户要求的复杂过程。 在现代物流流程中,一般会经历如下几个环节: 工厂根据订单生产货物供货 调度车辆运输货物 货物流入近终端仓库中转 派件机构揽送配送 交付最终用户 在上图所示的物流环节中,仓储定位于“订单&生产”和“园区仓储”环节 智慧是什么? “智慧”体现在通过一系列IOT+5G+AI技术,在物流生命周期的各个环节和场景中,实现低成本、高效率、高准确率、高业务量的需求,提供更可靠可用的服务。比如整个物流生命周期,有如下可以自动化、信息化的细分场景: 智慧仓储主要聚焦于解决货物出入库、资产盘点、智能分拣、货物跟踪定位等场景中的关键问题。 仓储管理的痛点 在智慧仓储覆盖的四大场景业务中,当前传统WMS系统或解决方案有如下几个问题。 1.出入库场景 一般使用基于面单扫描的扫描枪进行人工扫描,在货车到达仓库门的时候,先人工扫描,核对完成后,再使用叉车分批拉入仓库

关于加和减

筅森魡賤 提交于 2020-08-14 02:44:42
< div class="label-add" @click="addDomain( index )">&#43;</ div >//加 < div class="label-del" @click="removeDomain( index )">&ndash;</ div >//减 来源: oschina 链接: https://my.oschina.net/u/3407708/blog/4303646

leetcode111(二叉树的最小深度)--C语言实现

此生再无相见时 提交于 2020-08-14 02:29:39
求: 给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明: 叶子节点是指没有子节点的节点。 示例: 给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回它的最小深度 2. 解: 思路:与求二叉树的最大深度类似问题,最直接的方法都是递归求解,但是实现略有区别。 1、对每个节点而言,深度为左右子树深度的较小者+1(求最大深度是左右子树深度的较大者+1) 2、空节点应该返回INT_MAX(求最大深度时返回的是0),如果此处返回0,当一个节点某个子树为空,另一个子树非空时,计算得到的深度为1,显然不符合题目要求。(应该是2) 3、根节点要做特殊处理,如果根节点为空,返回INT_MAX显然不合理,此处直接返回0。 /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ int min( int x, int y){ return x<y?x:y; } int GetDepth( struct TreeNode* root){ if (root=

leetcode522(最长特殊序列II)--C语言实现

时间秒杀一切 提交于 2020-08-14 02:11:52
求: 给定字符串列表,你需要从它们中找出最长的特殊序列。最长特殊序列定义如下:该序列为某字符串独有的最长子序列(即不能是其他字符串的子序列)。 子序列 可以通过删去字符串中的某些字符实现,但不能改变剩余字符的相对顺序。空序列为所有字符串的子序列,任何字符串为其自身的子序列。 输入将是一个字符串列表,输出是最长特殊序列的长度。如果最长特殊序列不存在,返回 -1 。 示例: 输入: "aba", "cdc", "eae" 输出: 3 提示: 所有给定的字符串长度不会超过 10 。 给定字符串列表的长度将在 [2, 50 ] 之间。 解: 思路:这是leetcode521的变形题,2个字符串的比较变成了字符串数组的比较,但思路基本一致。(可以把2个字符串看做字符串数组的简化情形) 针对字符串数组,逐个检索字符串,判断它是否是某个字符串数组中的字符串的子串,如果都不是,判断它的长度是否大于当前记录的最大子序列长度,如果大于最大子序列长度,则更新最大子序列长度。完成字符串数组的遍历后,返回即可。注意这里子序列的定义,此处的包含并不是连续的包含字符,所以不能使用strstr库函数判断,需要自己实现一个函数。(我这里对应的函数是isContain()) int isContain( const char *a, const char *b){ //查找b里是否有a while (*a!= ' \

大数据实践解析(下):Spark的读写流程分析

旧巷老猫 提交于 2020-08-14 01:57:30
导读: 众所周知,在大数据/数据库领域,数据的存储格式直接影响着系统的读写性能。spark是一种基于内存的快速、通用、可扩展的大数据计算引擎,适用于新时代的数据处理场景。在“ 大数据实践解析(上):聊一聊spark的文件组织方式 ”中,我们分析了spark的多种文件存储格式,以及分区和分桶的设计。接下来,本文通过简单的例子来分析在Spark中的读写流程,主要聚焦于Spark中的高效并行读写以及在写过程中如何保证事务性。 1、文件读 如何在Spark中做到高效的查询处理呢?这里主要有两个优化手段: 1)减少不必要的数据处理。数据处理涉及文件的IO以及计算,它们分别需要耗费大量的IO带宽和CPU计算。在实际的生产环境中,这两类资源都是有限的,同时这些操作十分耗时,很容易成为瓶颈,所以减少不必要的数据处理能有效提高查询的效率; 以下面的查询为例: spark.read.parquet("/data/events") .where("year = 2019") .where("city = 'Amsterdam'") .select("timestamp") 由于在events表中按照year字段做了分区,那么首先通过 year 字段我们就可以过滤掉所有year字段不为 2019 的分区: 因为文件是parquet的文件格式,通过谓词下推可以帮助我们过滤掉 city 字段不是

FreeRTOS 消息队列

情到浓时终转凉″ 提交于 2020-08-14 01:24:12
以下基础内容转载自安富莱电子: http://forum.armfly.com/forum.php 本章节为大家讲解 FreeRTOS 的一个重要的通信机制----消息队列,初学者要熟练掌握,因为消息队 列在实际项目中应用较多。 消息队列的概念及其作用 消息队列就是通过 RTOS 内核提供的服务,任务或中断服务子程序可以将一个消息( 注意,FreeRTOS 消息队列传递的是实际数据,并不是数据地址,RTX,uCOS-II 和 uCOS-III 是传递的地址 )放入到队列。 同样,一个或者多个任务可以通过 RTOS 内核服务从队列中得到消息。通常,先进入消息队列的消息先传 给任务,也就是说,任务先得到的是最先进入到消息队列的消息,即先进先出的原则(FIFO),FreeRTOS 的消息队列支持 FIFO 和 LIFO 两种数据存取方式。 也许有不理解的初学者会问采用消息队列多麻烦,搞个全局数组不是更简单,其实不然。在裸机编程 时,使用全局数组的确比较方便,但是在加上 RTOS 后就是另一种情况了。 相比消息队列,使用全局数组 主要有如下四个问题:  使用消息队列可以让 RTOS 内核有效地管理任务,而全局数组是无法做到的,任务的超时等机制需要用户自己去实现。  使用了全局数组就要防止多任务的访问冲突,而使用消息队列则处理好了这个问题,用户无需担心。 