mongodb - 将带有“hasMany”的模型链接到带有数组的模型
问题描述
我有 2 个简单的模型:
Person:
- id: "1234"
- name: "John"
Jobs:
- title: "Programmer"
- personList:[{
- personId: "1234"
- personName: "John"
},
{
... another person
}]
简而言之,我想运行这个简单的查询:
http://example.com/person?filter={"include":"jobs"}
因此,我可以将Person模型链接到Jobs模型,并且也可以简单地获取所有人员工作。
通常,您会使用 hasMany 关系来做到这一点,但是如果它是一个对象数组,如何实现呢?
解决方案
您可以使用以下聚合管道来$lookup
收集作业并返回匹配的作业
在 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()
推荐阅读
- excel - 在 Excel 电子表格中添加行时,冻结宏中的行以停止隐藏/取消隐藏移动
- windows - 从电脑复制时无法运行 Xcode 项目
- typescript - Typescript:基于属性值的属性类型
- css - 移动设备上的扩展图像,背景固定
- javascript - Angular2 +整个DOM在组件加载ngFor上闪烁
- java - 如何通过对象变量字符串对对象的arraylist进行排序
- sql-server-2008 - 删除空列并合并行
- r - 使用向量中的值和名称对数据框进行子集化的简单有效方法
- android - 想要确定哪个提供商在 android 中为我提供位置(无论是 gps 还是蜂窝/wifi 网络)
- r - maps::map() 返回地区名称而不是国家名称