如何解决基于两种模式的MongoDB $ lookup
我想知道如何基于另外两个模式集合在mongo db中进行查询。
我在mongo db中有3个架构:
1. Site : {_id,name}
2. Components : { _id,siteId,details }
3. Maintenance : { _id,siteId }
我想查询并使用components
获取所有site information
,同时确保它们不在maintenance
中。
我可以通过以下查询用components
来获取site information
:
componentCollection
.aggregate([
{
$lookup: {
from: 'sites',localField: 'siteId',foreignField: '_id',as: 'sites',},])
如何更新此查询,以便确保所选的components
网站的不在maintenance
集合中?
使用示例数据,预期和当前输出进行更新:
`Site`
---------------------------
_id | name
---------------------------
1 | site1
---------------------------
2 | site2
---------------------------
`Components`
---------------------------
_id | siteId | details
---------------------------
3 | 1 | help & support
---------------------------
4 | 2 | footer links
---------------------------
`Maintenance`
---------------------------
_id | siteId
---------------------------
5 | 1
---------------------------
通过上面的示例查询,我得到以下结果:
[
{
_id: 3,siteId: 1,details: 'help & support',sites: [
{
_id: 1,name: 'site1'
}
]
},{
_id: 4,siteId: 2,details: 'footer links',sites: [
{
_id: 2,name: 'site2'
}
]
}
]
但是我只想在下面,因为site1
处于维护模式
[
{
_id: 4,name: 'site2'
}
]
}
]
解决方法
这可能会对您有所帮助。
- 加入 Components 集合和 Site 集合
- 嵌套加入站点和维护。因为如果维护具有站点,我们可以轻松消除该对象。
- 如果 joinMaintenance 是使用
$filter
的空数组,则过滤出Site数组中的对象。 - 因此,如果 joinMaintenance 没有任何对象,则它将存在于站点
这是代码
[
{
"$lookup": {
"from": "Site","let": {
"sId": "$siteId"
},"pipeline": [
{
$match: {
$expr: {
$eq: [
"$_id","$$sId"
]
}
}
},{
$lookup: {
from: "Maintenance",let: {
"smId": "$_id"
},pipeline: [
{
"$match": {
$expr: {
$eq: [
"$siteId","$$smId"
]
}
}
}
],as: "joinMaintenance"
}
}
],as: "sites"
}
},{
$project: {
details: 1,siteId: 1,sites: {
$filter: {
input: "$sites",cond: {
$eq: [
"$$this.joinMaintenance",[]
]
}
}
}
}
},{
$match: {
$expr: {
$ne: [
"$sites",[]
]
}
}
},{
$project: {
"sites.joinMaintenance": 0
}
}
]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。