首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将“类型”信息复制到mongo聚合和查找中的“实例”中.保留原来的名单?

如何将“类型”信息复制到mongo聚合和查找中的“实例”中.保留原来的名单?
EN

Stack Overflow用户
提问于 2019-08-10 15:38:49
回答 1查看 47关注 0票数 0

在mongo聚合过程中,我试图将类型信息复制到“实例”上.并完整地返回原始对象结构。

一些澄清:一个例子意味着一个病人有记录表明他们有'Asprin‘的药物。它只包含medicationId以及开始和停止日期。不是所有的药物治疗信息。在不同的集合中是所有可能的药物类型。我们称前者为实例,而后者称为类型。

我想做的是,当我们找回病人的时候,我们当然也会把所有的药物都还给那个病人。但是我需要在病人的“拷贝”上服用这5种药物,而不是类型的名称和描述。最后的结果将是整个病人的记录,包括药物,加上药物的名称和类型的描述。

在代码中,我只需循环每种药物,然后使用药物Id查询类型并设置名称。这在DB中应该非常容易做到。

试图在数据库代码中这样做。

例句:我收集了一组药物类型。每种类型都有一个名称、id和dosage..etc。

`

代码语言:javascript
复制
db.medications.insert([
                {"medicationId": "1","Name": "Asprin",... },
                {"medicationId": "2","Name": "Tylenol", ... }]);

`

在病人的记录上,病人有一份药物清单。db.patients.insert([{ "firstName": "patient1", "medications": [ {"medicationId":"1", ... }, {"medicationId":"2", ... }, ] }和我要做的只是通过匹配类型集合中的medicationId,在患者上的每个“实例”上填充药物的名称。

对于我们来说,这是一个非常常见的模式,我们总是存储很多关于类型的信息,但是实例确实很紧。但在某些情况下,我们希望在显示病人记录时显示类型信息(例如名称和描述)。

我不知道如何将集合作为查找管道的一部分。我似乎只能返回与药物Id匹配的药物列表,但随后我松开了原来的设置。

我尝试了下面的方法,但是它只是用类型集合中的一种药物来代替药物。

{ $lookup: { from: "medications", localField: "medications.medicationId", foreignField: "medicationId", as: "medications" }, })

如果他们刚刚合并,我会很高兴的。我试过了,但是在查找管道中不允许合并?好消息是,上面的这些保留了原始的“病人”记录,这正是我想要的,但现在我只需要将两者合并。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-11 08:01:04

让我们假设您在DB中有以下数据:

代码语言:javascript
复制
medications:
    {
        "_id" : ObjectId("5d4fc7c8a412da1f166525e5"),
        "medicationId" : "1",
        "Name" : "Asprin"
    }
    {
        "_id" : ObjectId("5d4fc7c8a412da1f166525e6"),
        "medicationId" : "2",
        "Name" : "Tylenol"
    }

patients:
{
    "_id" : ObjectId("5d4fc7eaa412da1f166525e7"),
    "firstName" : "patient1",
    "medications" : [
        {
            "medicationId" : "1"
        },
        {
            "medicationId" : "2"
        }
    ]
}

以下查询可以获得预期的输出:

代码语言:javascript
复制
db.patients.aggregate([
    {
        $unwind:"$medications"
    },
    {
        $lookup:{
            "from":"medications",
            "localField":"medications.medicationId",
            "foreignField":"medicationId",
            "as":"medicationsLookup"
        }
    },
    {
        $unwind:{
            "path":"$medicationsLookup",
            "preserveNullAndEmptyArrays":true
        }
    },
    {
        $addFields:{
            "medications.Name":"$medicationsLookup.Name"
        }
    },
    {
        $group:{
            "_id":"$_id",
            "firstName":{
                $first:"$firstName"
            },
            "medications":{
                $push:"$medications"
            }
        }
    }
]).pretty()

输出:

代码语言:javascript
复制
{
    "_id" : ObjectId("5d4fc7eaa412da1f166525e7"),
    "firstName" : "patient1",
    "medications" : [
        {
            "medicationId" : "1",
            "Name" : "Asprin"
        },
        {
            "medicationId" : "2",
            "Name" : "Tylenol"
        }
    ]
}

注:两个集合仍然完好无损。

聚合阶段详细信息:

  • 第一阶段:打开药物阵列
  • 第二阶段:从数组中查找每个药物Id,并在“药物收集”中显示药物Id
  • 第三阶段:在管道中添加新的字段“名称”
  • 第四阶段:根据对象ID将返回数据分组
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57443513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档