【发布时间】:2021-04-09 11:35:01
【问题描述】:
我有两个收藏。
第一次收藏
{ _id:"601d07fece769400012f1280",
FieldName:"Employee",
Type:"Chapter" }
第二次合集
_id : "601d11905617082d7049153a",
SurveyId : "601d118e5617082d70491539",
TemplateName : "",
Elements : [
{
_id : "601d07fece769400012f1280",
FieldName : "Employee",
Type : "Chapter"
},
{
_id : "601d07fece769400012f1281",
FieldName : "Contract",
Type : "Chapter"
}]
当我进行查找时
'$lookup': {
'from': 'SecondCollection',
'localField': 'FieldName',
'foreignField': 'Elements.FieldName',
'as': 'SurveyInfo'
}
我会得到正确的结果,但有时我会得到“SecondCollection 匹配管道的 $lookup 阶段中文档的总大小超过 16793600 字节”。
所以我改变了方法,将第二个集合加入管道,所以我只得到了我需要的字段。
"from": 'SecondCollection',
"let": { "fieldname": "$fieldname" },
"pipeline": [
{ "$match":
{ "$expr":
{ "$eq": ["$elements.fieldname", "$$fieldname"] }}},
{ "$project": { "SurveyId": 1}}
],
"as": 'SurveyInfo'
现在的问题是这会返回所有 SecondCollection 文档。不返回匹配的文档。
我想得到以下结果
_id:"601d07fece769400012f1280",
FieldName:"Employee",
Type:"Chapter",
SurveyInfo: [
{
_id:"601d11905617082d7049153a",
SurveyId:"601d118e5617082d70491539"
}
]
我无法找出问题所在。请帮帮我。
【问题讨论】:
-
将第一个字符更改为大写字母,总是给出空结果。
-
尝试
$in而不是$eq并更正您的字段名称elements.fieldname驼峰式大小写和fieldname并查看工作 playground -
"... 现在的问题是这会返回所有 SecondCollection 文档。不返回匹配的文档..." 您可能需要在以下投影中过滤数组.
-
@turivishal 还有一个问题,当我想对 Elements 数组中的子元素应用过滤器时,它失败了。请查看更新后的游乐场mongoplayground.net/p/68KeLN72nz0
-
你能解释一下你在做什么过滤吗,你只选择了一个字段
SurveyId
标签: mongodb mongodb-query aggregation-framework mongodb-compass