sql - 我正在尝试将复杂的 SQL 查询转换为 MongoDB 查询,但是在为连接的结果集添加条件时失败
问题描述
我编写了一个 SQL 查询,显示我想要的结果集。我想为 MongoDB 写等效的东西。我检查了文档和其他来源以使其实现,但我坚持添加条件。
这是我的 SQL 代码;
--MSSQL AND POSTGRESQL QUERY
SELECT
A.*,
B.SYMPTOM1,
B.SYMPTOM2,
B.SYMPTOM3,
B.SYMPTOM4,
B.SYMPTOM5,
C.RECVDATE,
CASE C.STATE WHEN NULL THEN 'Unknown' ELSE C.STATE END AS STATE,
CASE C.AGE_YRS WHEN NULL THEN 0 ELSE C.AGE_YRS END AS AGE_YRS,
(CAST(COALESCE(C.CAGE_YR,0) AS float) + COALESCE(C.CAGE_MO,0.0)) AS VAX_DATE_BIRTHDATE,
C.SEX,
C.RPT_DATE,
C.SYMPTOM_TEXT,
CASE C.DIED WHEN NULL THEN 'N' ELSE C.DIED END AS DIED,
C.DATEDIED,
CASE C.L_THREAT WHEN NULL THEN 'N' ELSE C.L_THREAT END AS L_THREAT,
CASE C.ER_VISIT WHEN NULL THEN 'N' ELSE C.ER_VISIT END AS ER_VISIT,
CASE C.HOSPITAL WHEN NULL THEN 'N' ELSE C.HOSPITAL END AS HOSPITAL,
CASE C.HOSPDAYS WHEN NULL THEN 0 ELSE C.HOSPDAYS END AS HOSPDAYS,
CASE C.X_STAY WHEN NULL THEN 'N' ELSE C.X_STAY END AS X_STAY,
CASE C.DISABLE WHEN NULL THEN 'N' ELSE C.DISABLE END AS DISABLE,
CASE C.RECOVD WHEN NULL THEN 'U' ELSE C.RECOVD END AS RECOVD,
C.VAX_DATE,
C.ONSET_DATE,
CASE C.NUMDAYS WHEN NULL THEN 0 ELSE C.NUMDAYS END AS NUMDAYS,
C.LAB_DATA,
CASE C.V_ADMINBY WHEN NULL THEN 'UNK' ELSE C.V_ADMINBY END AS V_ADMINBY,
CASE C.V_FUNDBY WHEN NULL THEN 'UNK' ELSE C.V_FUNDBY END AS V_FUNDBY,
C.OTHER_MEDS,
C.CUR_ILL,
C.HISTORY,
C.PRIOR_VAX,
C.SPLTTYPE,
C.FORM_VERS AS VAERS_FORM_VERSION,
C.TODAYS_DATE,
CASE C.BIRTH_DEFECT WHEN NULL THEN 'N' ELSE C.BIRTH_DEFECT END AS BIRTH_DEFECT,
CASE C.OFC_VISIT WHEN NULL THEN 'N' ELSE C.OFC_VISIT END AS OFC_VISIT,
CASE C.ER_ED_VISIT WHEN NULL THEN 'N' ELSE C.ER_ED_VISIT END AS ER_ED_VISIT,
CASE C.ALLERGIES WHEN NULL THEN 'none' ELSE C.ALLERGIES END AS ALLERGIES
FROM VAERSVAX AS A
INNER JOIN VAERSSYMPTOMS AS B ON
A.VAERS_ID = B.VAERS_ID
INNER JOIN VAERSDATA AS C ON
A.VAERS_ID = C.VAERS_ID
WHERE (B.SYMPTOM1 LIKE '%COVID%' OR B.SYMPTOM2 LIKE '%COVID%' OR B.SYMPTOM3 LIKE '%COVID%' OR B.SYMPTOM4 LIKE '%COVID%' OR B.SYMPTOM5 LIKE '%COVID%')
AND A.VAX_TYPE = 'COVID19'
这是我对 MongoDB 等价物的尝试;
db.VaersVax.aggregate([
{
$match: { "VAX_TYPE" : "COVID19" }
},
{
$lookup:
{
from: "VaersSymptoms",
localField: "VAERS_ID",
foreignField: "VAERS_ID",
as: "VaersSymptoms"
},
},
{
$lookup:
{
from: "VaersData",
localField: "VAERS_ID",
foreignField: "VAERS_ID",
as: "VaersData"
}
},
{
$project:
{
VaersSymptoms:
{
$filter:
{
input: "$VaersSymptoms",
as: "a",
cond: { $in: [ "$$a.SYMTOM1", [db.VaersSymptoms.find({"SYMPTOM1": /COVID/})]]}
}
}
}
}
]);
我对 SQL 没问题,但我是 MongoDB 的新手。所以我卡在这里。任何帮助,将不胜感激。
此致
解决方案
我可以在比我更了解 mongo 的朋友的支持下解决它。总结一下,mongo脚本最后的状态是这样的;
db.VaersVax.aggregate([
{
$lookup:
{
from: "VaersSymptoms",
localField: "VAERS_ID",
foreignField: "VAERS_ID",
as: "VaersSymptoms"
}
},
{
$lookup:
{
from: "VaersData",
localField: "VAERS_ID",
foreignField: "VAERS_ID",
as: "VaersData"
}
},
{ $unwind: "$VaersSymptoms" },
{
"$match": {
"$and":[
{"VAX_TYPE":"COVID19"},
{"$or":[
{"VaersSymptoms.SYMPTOM1": /.*COVID.*/},
{"VaersSymptoms.SYMPTOM2": /.*COVID.*/},
{"VaersSymptoms.SYMPTOM3": /.*COVID.*/},
{"VaersSymptoms.SYMPTOM4": /.*COVID.*/},
{"VaersSymptoms.SYMPTOM5": /.*COVID.*/},
]}
]
}
}
]);
推荐阅读
- locust - 可以为每个任务设置 min_wait/max_wait 或类似的东西吗?
- javascript - Django + React Project 无法加载静态文件
- php - 重启apache2.4时如何修复错误
- amazon-web-services - AWS Polly 不支持的特殊字符
- android-studio - Android Studio 本地 Subversion 服务器
- php - 如何知道 APCu 缓存何时因为已满而被清除?
- c++ - C ++中的memset函数无法正常工作
- android - 如何在 Cordova 中下载大文件?
- c# - 如何在 C# 中获取具有未知连接信息的 SQL 文件信息?
- javascript - javascript中的闰秒在哪里?