如何获取满足匹配对象的关联文档
Posted
技术标签:
【中文标题】如何获取满足匹配对象的关联文档【英文标题】:How to get associated document who satisfy match object 【发布时间】:2021-11-06 19:09:21 【问题描述】:在以下查询中,我想获取所有经过验证的学生及其相关会议。但试图获取所有即将到来的会议,这意味着会议至少有一个未来的日期时间。我的书面查询会获取所有经过验证的学生,但也会获取学生的所有会议,包括过去的会议。我希望仅在有任何即将举行的会议时才获取学生,并且仅在返回协会中获取即将举行的会议。我想根据最近的会议对客户对象数组进行排序任何帮助将不胜感激
let aggregateDataQuery = [
$lookup:
from: 'meetup',
localField: '_id',
foreignField: 'studentId',
as: 'meetup',
,
,
$project:
firstName: 1,
lastName: 1,
email: 1,
meetup:
_id: 1,
startTime: 1,
,
,
,
];
const [result, err] = await of(
Student.aggregate([
...aggregateDataQuery,
$match:
verified: true,
'meetup.startTime': '$gte': 2021-09-10T08:41:15.746Z
,
$facet:
data: [
$sort: sortBy ,
$skip: skip ,
$limit: recordLimit ,
],
count: [
$count: 'count',
,
],
,
,
])
);
【问题讨论】:
【参考方案1】:根据两个集合的规模,我建议从 meetings
集合开始查询,因为这样您可以更好地利用会议时间的索引(想象没有未来的会议,在当前的方法中您仍然匹配并查找整个学生集合)。
但是,您目前的方法很好,只需要一个小调整,我们需要过滤掉“旧”会议,为此让我们使用join condition lookup syntax。
现在您的新查找阶段将如下所示:
"$lookup":
"from": "meetup",
"let":
studentId: "$_id"
,
"pipeline": [
$match:
$expr:
$and: [
$eq: [
"$$studentId",
"$studentId"
],
,
$gt: [
"$startTime",
"$$NOW"
],
]
,
$project:
_id: 1,
startTime: 1,
],
"as": "meetup"
Mongo Playground
您需要的行为将在您的管道的其余部分按预期工作。
您可以将 $match
查询更改为:
$match:
verified: true,
'meetup.0': $exists: true
【讨论】:
以上是关于如何获取满足匹配对象的关联文档的主要内容,如果未能解决你的问题,请参考以下文章
如何从 mongodb 通过 Geowithin 获取匹配的子文档?
如何使用 Apache DbUtils 获取一对多关联和父子类型关联?