首页 > 解决方案 > 将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 聚合表达式吗?

标签: mongodbaggregation-framework

解决方案


我终于让它工作了。

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
    }
  }
]);

推荐阅读