如何将 'type' 信息复制到 mongo 聚合和查找中的 'instance' 中...并保留原始列表?
How to copy 'type' information into an 'instance' in mongo aggregation and Lookup... and keep the original list?
在 mongo 聚合期间,我试图将类型信息复制到 'instance'... 并且 return 原始对象结构完好无损。
一些说明:一个实例意味着患者有记录表明他们有 'Asprin' 的药物。它仅包含 medicationId 以及开始和停止日期。不是完整的药物信息。在不同的集合中是所有可能的药物类型。我们称前者为实例,后者为类型。
我想做的是当我们找回病人时,我们当然也会return那个病人身上的所有药物。但是然后我需要根据类型的名称和描述对患者 'copy' 服用 5 种药物。最终结果将是整个患者记录,包括药物,加上药物名称和类型描述。
在代码中,我将遍历每种药物,然后使用药物 ID 查询类型并设置名称。这在数据库中应该很容易做到。
尝试在 db verses 代码中执行此操作。
示例:我有一组药物类型。每种类型都有名称、ID 和剂量等。
`
db.medications.insert([
{"medicationId": "1","Name": "Asprin",... },
{"medicationId": "2","Name": "Tylenol", ... }]);
`
在患者病历上,患者有一份药物清单。
db.patients.insert([{
"firstName": "patient1",
"medications": [
{"medicationId":"1", ... },
{"medicationId":"2", ... },
]
}
我想要做的只是通过匹配类型集合中的 medicationId 来填充患者每个 'instance' 药物的名称。
这对我们来说是一种非常常见的模式,我们总是在类型上存储大量信息,但实例非常紧凑。但是我们希望在显示患者记录时在某些情况下显示类型信息(例如姓名和描述)。
我不知道如何将集合作为查找管道的一部分。我似乎只能 return 与药物 ID 匹配的药物列表,但后来我丢失了原始集。
我尝试了以下方法,但它只是将药物替换为类型集合中的药物。
{ $lookup:
{
from: "medications",
localField: "medications.medicationId",
foreignField: "medicationId",
as: "medications"
},
})
如果它们刚刚合并我会很高兴。我试过了但是在查找管道中以某种方式不允许合并?好消息是上面的原始 'patient' 记录完好无损,这正是我想要的,但现在我只需要以某种方式合并两者
假设您在数据库中有以下数据:
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"
}
]
}
以下查询可以获得预期的输出:
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()
输出:
{
"_id" : ObjectId("5d4fc7eaa412da1f166525e7"),
"firstName" : "patient1",
"medications" : [
{
"medicationId" : "1",
"Name" : "Asprin"
},
{
"medicationId" : "2",
"Name" : "Tylenol"
}
]
}
注:两套藏品都完好无损
聚合阶段详细信息:
- 第一阶段:展开药物阵列
- 第二阶段:从数组中查找每个药物 ID,药物 ID 存在于 'medications' 集合
- 第三阶段:在管道中添加新字段'Name'
- 第四阶段:根据对象 ID 对数据进行分组
在 mongo 聚合期间,我试图将类型信息复制到 'instance'... 并且 return 原始对象结构完好无损。
一些说明:一个实例意味着患者有记录表明他们有 'Asprin' 的药物。它仅包含 medicationId 以及开始和停止日期。不是完整的药物信息。在不同的集合中是所有可能的药物类型。我们称前者为实例,后者为类型。
我想做的是当我们找回病人时,我们当然也会return那个病人身上的所有药物。但是然后我需要根据类型的名称和描述对患者 'copy' 服用 5 种药物。最终结果将是整个患者记录,包括药物,加上药物名称和类型描述。
在代码中,我将遍历每种药物,然后使用药物 ID 查询类型并设置名称。这在数据库中应该很容易做到。
尝试在 db verses 代码中执行此操作。
示例:我有一组药物类型。每种类型都有名称、ID 和剂量等。
`
db.medications.insert([
{"medicationId": "1","Name": "Asprin",... },
{"medicationId": "2","Name": "Tylenol", ... }]);
`
在患者病历上,患者有一份药物清单。
db.patients.insert([{
"firstName": "patient1",
"medications": [
{"medicationId":"1", ... },
{"medicationId":"2", ... },
]
}
我想要做的只是通过匹配类型集合中的 medicationId 来填充患者每个 'instance' 药物的名称。
这对我们来说是一种非常常见的模式,我们总是在类型上存储大量信息,但实例非常紧凑。但是我们希望在显示患者记录时在某些情况下显示类型信息(例如姓名和描述)。
我不知道如何将集合作为查找管道的一部分。我似乎只能 return 与药物 ID 匹配的药物列表,但后来我丢失了原始集。
我尝试了以下方法,但它只是将药物替换为类型集合中的药物。
{ $lookup:
{
from: "medications",
localField: "medications.medicationId",
foreignField: "medicationId",
as: "medications"
},
})
如果它们刚刚合并我会很高兴。我试过了但是在查找管道中以某种方式不允许合并?好消息是上面的原始 'patient' 记录完好无损,这正是我想要的,但现在我只需要以某种方式合并两者
假设您在数据库中有以下数据:
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"
}
]
}
以下查询可以获得预期的输出:
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()
输出:
{
"_id" : ObjectId("5d4fc7eaa412da1f166525e7"),
"firstName" : "patient1",
"medications" : [
{
"medicationId" : "1",
"Name" : "Asprin"
},
{
"medicationId" : "2",
"Name" : "Tylenol"
}
]
}
注:两套藏品都完好无损
聚合阶段详细信息:
- 第一阶段:展开药物阵列
- 第二阶段:从数组中查找每个药物 ID,药物 ID 存在于 'medications' 集合
- 第三阶段:在管道中添加新字段'Name'
- 第四阶段:根据对象 ID 对数据进行分组