mongodb - 将sql查询翻译成mongodb查询
问题描述
我试图通过将我们的一些 sql 查询转换为 mongo 聚合框架来掌握 mongodb 概念。
我有一个sql代码:
select dbo.VisitNo(u.id) as visitNo , o.id, o.PatientId, u.VisitDate
from dbo.Observation o
join sbo.ProspectiveFollowUp u on u.rootid = o.Id
order by o.PatientId
dbo.VisitNo 实现为:
CREATE FUNCTION dbo.VisitNo(@Id int)
RETURNS INT
AS
BEGIN
DECLARE @VisitDate date, @RootId int
SELECT @VisitDate=VisitDate, @RootId=RootId FROM dbo.ProspectiveFollowUp WHERE Id=@Id
RETURN (SELECT COUNT(1) FROM dbo.ProspectiveFollowUp WHERE RootId = @RootId AND VisitDate <= @VisitDate)
END
结果:
我在 Mongo 中的文档具有以下结构:
{
"_id",
"values":[
{
"Id",
"PatientId",
"ProspectiveFollowUp":[
"Id",
"RootId",
"VisitDate"
]
}
]
}
values 数组始终只有一个元素,但这就是导入数据的方式。ProspectiveFollowUp 至少有一条记录。
创建用于检索数据的查询相当简单:
db.dbo_ObservationJSON.aggregate([
{ $unwind: '$values' },
{
$project: {
_id: 0,
Id: '$values.Id',
PatientId: '$values.PatientId',
VisitDate: '$values.ProspectiveFollowUp.VisitDate'
}
},
{ $unwind: '$VisitDate' },
{ $sort: { PatientId: 1 } }
])
更难的部分是自定义函数本身。我还不能在 od tsql 世界之外思考,所以我很难让它发挥作用。我已经通过以下方式将该函数翻译成 mongo:
var id = 4
var result = db.dbo.ObservationJSON.aggregate([
{ $unwind: '$values' },
{ $unwind: '$values.ProspectiveFollowUp' },
{ $project: { Id: '$values.ProspectiveFollowUp.Id', RootId: '$values.ProspectiveFollowUp.RootId', VisitDate: '$values.ProspectiveFollowUp.VisitDate', _id:0 }},
{ $match: { Id: id }}
]).toArray()[0]
var totalResult = db.dbo_ObservationJSON.aggregate([{
$unwind: {
path: '$values'
}
}, {
$unwind: {
path: '$values.ProspectiveFollowUp'
}
}, {
$project: {
Id: '$values.ProspectiveFollowUp.Id',
RootId: '$values.ProspectiveFollowUp.RootId',
VisitDate: '$values.ProspectiveFollowUp.VisitDate'
}
}, {
$match: {
RootId: result.RootId,
VisitDate: {
$lte: result.VisitDate
}
}
},{$count: 'total'}]).toArray()[0]
但不知道如何将其集成到上面的聚合函数中。我可以将整个 sql 查询等效地写入一个 mongo 聚合表达式吗?
解决方案
我终于让它工作了。
db.dbo_ObservationJSON.aggregate([
{ $unwind: '$values' },
{ $unwind: { path: '$values.ProspectiveFollowUp', "includeArrayIndex": "index" } },
{
$project: {
_id: 0,
VisitNo: { $add: ['$index', 1] },
RootId: '$values.ProspectiveFollowUp.RootId',
PatientId: '$values.PatientId',
VisitDate: '$values.ProspectiveFollowUp.VisitDate'
}
},
{
$sort: {
PatientId: 1
}
}
]);
推荐阅读
- java - IF 语句中的 Liquid Markup 多个条件
- typescript - 在编译时将生成的值嵌入 TypeScript 的最佳方法是什么?
- java - 在本地禁用 Spring Cloud Kubernetes
- python-3.x - dyld:库未加载:/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation
- r - 添加具有随机 11 位数字的新列
- angular - 如何在 TypeScript 中克隆对象?
- javascript - AWS 放大,等待 Auth.currentUserInfo
- python - 为什么pyinputplus中的allowRegexes关键字允许pyip.inputNum中的ABC(allowRegexes = [r'(C)+'])?
- node.js - 如何将数据从 RecordRTC 发送到 Vosk 以进行语音转文本
- c++ - C++动态二维数组声明