在mongo聚合过程中,我试图将类型信息复制到“实例”上.并完整地返回原始对象结构。
一些澄清:一个例子意味着一个病人有记录表明他们有'Asprin‘的药物。它只包含medicationId以及开始和停止日期。不是所有的药物治疗信息。在不同的集合中是所有可能的药物类型。我们称前者为实例,而后者称为类型。
我想做的是,当我们找回病人的时候,我们当然也会把所有的药物都还给那个病人。但是我需要在病人的“拷贝”上服用这5种药物,而不是类型的名称和描述。最后的结果将是整个病人的记录,包括药物,加上药物的名称和类型的描述。
在代码中,我只需循环每种药物,然后使用药物Id查询类型并设置名称。这在DB中应该非常容易做到。
试图在数据库代码中这样做。
例句:我收集了一组药物类型。每种类型都有一个名称、id和dosage..etc。
`
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" }, })
如果他们刚刚合并,我会很高兴的。我试过了,但是在查找管道中不允许合并?好消息是,上面的这些保留了原始的“病人”记录,这正是我想要的,但现在我只需要将两者合并。
发布于 2019-08-11 08:01:04
让我们假设您在DB中有以下数据:
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"
}
]
}注:两个集合仍然完好无损。
聚合阶段详细信息:
https://stackoverflow.com/questions/57443513
复制相似问题