将sql查询转换为mongodb查询

将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

我试图通过将一些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
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
    }
  }
]);