如何解决MongoDB聚合如何在过滤器和组中保留或过滤匹配的数组项
我目前能够获得 visitDate , visitOffice 匹配且有 visitFloors 重叠的文档。当$ in发现数组中的一个或多个 visitFloors 匹配项时,我需要弄清楚如何将匹配的 visitFloors 保留到临时数组中,以便分组,最后加上适当的用户和 visitDate 。
我在底部概述了首选的输出数据结构。
访问Doc结构:
{
"_id" : ObjectId("5efa717b6e25c11dbc518fa7"),"visitDate" : ISODate("2020-10-06T16:00:00.000+0000"),"user" : {
"FirstName" : "Joe","LastName" : "Smith","TimeId" : "00432"
},"type" : "Outbound","visitOffice" : "1111","visitFloors" : [
"9th Floor","10th Floor","11th Floor","12th Floor"
]
},{
"_id" : ObjectId("5efa717b6e25c11dbc518fb5"),"visitDate" : ISODate("2020-10-07T16:00:00.000+0000"),{
"_id" : ObjectId("5efa717b6e25c11dbc518f77"),"visitDate" : ISODate("2020-10-08T16:00:00.000+0000"),"12th Floor"
]
}
到目前为止,我所拥有的:仅返回用户的所有visitfloor,而不返回与指定visitDate匹配(重叠)的那些。
每个$ or对象将根据所需的访问日期,办公地点和访问楼层来构建。
_db.collection("visits").aggregate([{
"$match": {
"type": "Outbound","$or" : [
{
"visitDate": ISODate("2020-10-08T16:00:00.000+0000"),"visitFloors": {
"$in":["8th Floor","9th Floor","10th Floor"]
},"visitOffice": "1111"
},{
"visitDate": ISODate("2020-10-07T16:00:00.000+0000"),"11th Floor"]
},{
"visitDate": ISODate("2020-10-06T16:00:00.000+0000"),"visitOffice": "1111"
}
]
}
},{
"$group": {
"_id":{
"user": "$user",},"visitDates": {"$push":{"visitDate":"$visitDate","matchingVisitFloors":"$visitFloors"}}
}
},{
"$project":{
"_id":"$_id._id","user":"$_id.user","visitDates":"$visitDates"
}
}])
所需的输出:上面的 user 分组似乎可以适当地分隔结果,但是我愿意接受 user 分组的更可靠的方法。
{
"user" : {
"FirstName" : "Joe","visitDates" : [
{
"visitDate" : ISODate("2020-10-06T16:00:00.000+0000"),"matchingVisitFloors" : [
"9th Floor","10th Floor"
]
},{
"visitDate" : ISODate("2020-10-07T16:00:00.000+0000"),"11th Floor"
]
},{
"visitDate" : ISODate("2020-10-08T16:00:00.000+0000"),"matchingVisitFloors" : [
"10th Floor"
]
}
]
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。