Link 具有 'hasMany' 的模型到具有数组的模型
Link a model with 'hasMany' to a model with an array
我有 2 个简单模型:
Person:
- id: "1234"
- name: "John"
Jobs:
- title: "Programmer"
- personList:[{
- personId: "1234"
- personName: "John"
},
{
... another person
}]
简而言之,我想运行这个简单的查询:
http://example.com/person?filter={"include":"jobs"}
所以我可以 link 将 Person 模型转换为 Jobs 模型,并简单地获得所有人员的工作。
通常,您会使用 hasMany 关系来做到这一点,但是如果它是一个对象数组,该如何实现呢?
您可以使用以下聚合管道来 $lookup
作业收集和 return 匹配作业
在 mongo 3.6 及更高版本中
db.person.aggregate([
{$lookup : {
from : "jobs",
let : {"personId" : "$id"},
pipeline : [
{$match : {"$expr" : {$in : ["$$personId", "$personList.personId"]}}},
{$addFields : {personList : {$filter : {input : "$personList", as : "p", cond : {$eq : ["$$personId", "$$p.personId"]}}}}}
],
as : "jobs"
}}
]).pretty()
我有 2 个简单模型:
Person:
- id: "1234"
- name: "John"
Jobs:
- title: "Programmer"
- personList:[{
- personId: "1234"
- personName: "John"
},
{
... another person
}]
简而言之,我想运行这个简单的查询:
http://example.com/person?filter={"include":"jobs"}
所以我可以 link 将 Person 模型转换为 Jobs 模型,并简单地获得所有人员的工作。
通常,您会使用 hasMany 关系来做到这一点,但是如果它是一个对象数组,该如何实现呢?
您可以使用以下聚合管道来 $lookup
作业收集和 return 匹配作业
在 mongo 3.6 及更高版本中
db.person.aggregate([
{$lookup : {
from : "jobs",
let : {"personId" : "$id"},
pipeline : [
{$match : {"$expr" : {$in : ["$$personId", "$personList.personId"]}}},
{$addFields : {personList : {$filter : {input : "$personList", as : "p", cond : {$eq : ["$$personId", "$$p.personId"]}}}}}
],
as : "jobs"
}}
]).pretty()