当前位置: 首页 > 知识库问答 >
问题:

MongoDB转换Select from UNION with Group

奚才良
2023-03-14

我正在NodeJS中构建一个非常好的API,其中有关于我的国家的非常深入的细节。

由于巨额的帐单,我决定重写我的整个数据库,从MySQL到NoSQL,这是我更负担得起的。

基本上我要做的是,如果date_set为空,那么我将使用date_sampen作为代理。

我有以下MySQL查询,我需要将其转换为NoSQL。

SELECT count(a.cases) as cases, a.date FROM 
(SELECT date_specimen AS cases, date_specimen AS date from case_informations WHERE (date_specimen <> '' AND date_onset = '') 
UNION ALL
SELECT date_onset AS cases, date_onset AS date FROM case_informations WHERE date_onset <> '') AS a
GROUP BY a.date ORDER BY a.date ASC

文件:

{
    "_id": {
        "$oid": "5f29a6dcc4ce73be6be928ff"
    },
    "case_code": "C611583",
    "age": 20,
    "age_group": "20-24",
    "sex": "female",
    "date_specimen": "",
    "date_result_release": "2020-04-22",
    "date_rep_conf": "2020-04-24",
    "date_died": "",
    "date_recover": "",
    "removal_type": "recovered",
    "admitted": "no",
    "region_res": "NCR",
    "prov_res": "",
    "city_mun_res": "",
    "city_muni_psgc": "",
    "health_status": "recovered",
    "quarantined": "no",
    "date_onset": "",
    "pregnant_tab": "no",
    "validation_status": "Removal Type is \"Recovered\", but no Recovered Date is recorded\nRemoval Type is \"Recovered\", but no Recovered Date is recorded\nHealth Status is \"Recovered\", but no Date Recovered is recorded\nHealth Status is \"Recovered\", but no Date Recovered is recorded"
}

这是我能得到的最接近的结果:

collection.aggregate([
            {$project: {date_specimen: 1, date_onset: 1}},
            {$lookup:
                {
                  from: 'case_informations',
                  pipeline: [
                    {$match: {date_specimen: {$exists: true}, date_onset: ''}},
                    {$group: {_id: '$date_specimen', cases: {$sum: 1}}},
                    {$sort: {_id: 1}},
                  ],
                  as: 'a',
                },
            },
            {$lookup:
                {
                  from: 'case_informations',
                  pipeline: [
                    {$match: {date_onset: {$exists: true}}},
                    {$group: {_id: '$date_onset', cases: {$sum: 1}}},
                    {$sort: {_id: 1}},
                  ],
                  as: 'b',
                },
            },
            {$project: {'a': 1, 'b': 1}},
          ]).limit(1);

结果:

{
  _id: 5f29a6dcc4ce73be6be928fc,
a: [
    { _id: '2020-03-04', cases: 1 },
    { _id: '2020-03-06', cases: 8 },
    { _id: '2020-03-07', cases: 48 },
    {...}
   ],
b: [
    { _id: '2020-03-03', cases: 45 },
    { _id: '2020-03-04', cases: 32 },
    { _id: '2020-03-05', cases: 55 },
    {...}
]
}

应为:

{
  _id: 5f29a6dcc4ce73be6be928fc,
UnionOfAandC: [
    { _id: '2020-03-03', cases: 45 },
    { _id: '2020-03-04', cases: 33 }, // merge object with same date
    { _id: '2020-03-05', cases: 55 },
    { _id: '2020-03-06', cases: 8 },
    { _id: '2020-03-07', cases: 48 },
    {...},
   ],
}

共有1个答案

齐承运
2023-03-14

经过反复试验,我最终使用$cond解决了这个问题

collection.aggregate([
            {
              $group: {
                _id: {
                  'date': {
                    $cond: {
                      if: {$eq: ['$date_onset', '']}, then: '$date_specimen', else: '$date_onset',
                    },
                  },
                },
                cases: {$sum: 1},
              },
            },
            {$sort: {'_id.date': 1}},
          ]);
 类似资料:
  • 问题内容: 我有一些代码可以从集合中提取所有文档并将其放到网页上。简化版本如下所示: 我有一个driveInfo集合,其中包含很长的文档列表。每个文档包含嵌套的对象。我想做的是,每当有人在其浏览器中访问/ drive时,将整个集合打印为json对象,以便以后可以用jquery抓取所有内容(api的开头) 但是,我收到一条错误消息:“ TypeError:将圆形结构转换为JSON”。页面上的错误指向

  • 我想将MongoDB值字段的字符串转换为整数,然后计算平均值。 这是我的JSON: 但我也得到了这样的输出: {“_id”:ObjectId(“5C509604FC007808C427EDCB”),“values”: [“24.3”,“23.3”,“25.3”,“31.3”,“90.3”],“avgvalue”:null} 期望值应该是values字段的平均值。 我需要对嵌套文档值进行某种转换。

  • 问题内容: 将SQL数据库(例如1个表)转换为mongoDB文档的最佳方法是什么? 我想我可以使用C#驱动程序并实现一个循环,该循环选择表中的每一行并将其保存在Mongo中。但是,我正在寻找一种转换大量数据的更好方法。 问题答案: 司机的方式是FAR最直接的。导入/导出工具非常棒,但 前提 是您必须同时使用它们。如果您的表中包含日期,并且您尝试从数据库中导出并导入到mongo中,那么您将大吃一惊。

  • 我们有一个包含数百个类/枚举的大型应用程序,我们希望使用MongoDB来存储其中的一些。 目前的情况是,我们有一个二进制序列化的系统。NET对象转换为SQL数据库中的字段,然后按需反序列化。我们想要的是以一种允许我们直接查询对象属性的方式将对象放入Mongo(即,不必将对象加载到内存、反序列化等)。这样我们就可以从历史数据中获得一些分析,而无需大幅更改代码库。 我的问题是,这很容易实现吗?C#驱动

  • 问题内容: 有什么简单的方法可以将数据库从mysql更改为mongoDB? 或更好的一个建议我好的教程做到这一点 问题答案: 有什么简单的方法可以将数据库从mysql更改为mongoDB? 方法#1 :以CSV格式从MySQL导出,然后使用mongoimport工具。但是,这在处理二进制数据的日期方面并不总是很好。 方法2 :使用您选择的语言编写传输脚本。基本上,您编写了一个程序,一次从MySQL

  • 我有一个文档结构,其中有一些泛型类。对于给mongodb写信来说,一切都很好。但是当从mongodb中读取文档时,spring数据将文档错误地转换为对象。它将子文档转换为另一种类型。这两种类型(实际的子集合类型和错误转换的类型)都继承自同一个抽象类。 模型类:(getter setter由lombok生成) 如果有什么不清楚的事情,你可以问。 谢了。

  • 本文向大家介绍MongoDB查询以从ObjectId转换为String,包括了MongoDB查询以从ObjectId转换为String的使用技巧和注意事项,需要的朋友参考一下 在MongoDB中使用toString()将ObjectId转换为字符串。让我们创建一个包含文档的集合 在find方法的帮助下显示集合中的所有文档- 这将产生以下输出- 以下是将ObjectId转换为String的查询- 现

  • 当我尝试更新DB中的文档时,发生了一些错误。 以下是模式: 然后我从其他地方得到一些产品: 并更新Mu文档。请注意,我为“描述”设置了一个条件:如果它有空值,它将被更新——否则它将保持不变: } Go update(我使用mongoose):产品。updateOne({name:some_product.name},newProduct,{some params}) 我看到: 对于路径“descr