将sql查询转换为mongodb查询
我试图通过将一些sql查询转换为mongo聚合框架来掌握mongodb的概念 我有一个sql代码:将sql查询转换为mongodb查询,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我试图通过将一些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
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
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 } }
])
更难的部分是自定义函数本身。我还不能在ODTSQL世界之外思考,所以我很难让它工作。我已通过以下方式将函数转换为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
}
}
]);
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
}
}
]);