我在我的mongo聚合查询中执行一系列查找,展开,addField和项目。
我的数据库结构如下(精简):我有两个表A和B,A中的文档具有一个字段otherID,该字段要么包含null /不存在,要么包含对该文档中ID的引用B。
我正在执行查找以将两者合并在一起,将字段myField添加到A中返回的文档中,其中包含B中的文档。 此外,我需要在连接的子文档中重命名一个字段(或者,添加一个字段并排除另一个字段),因此我首先展开由连接返回的数组,执行一个addField,然后执行一个项目和一个组以放置所有内容回到数组形式。
问题是,在我正在执行的第二个lookup / addField / etc中,Mongo会为我创建一个字段,即使该文件原本应该存在的初始文档甚至不存在。
一个紧凑但更具体的查询(实际上要复杂一点,因为要进行两次查找):
{$lookup: {from: 'A',
localField: 'otherID', foreignField:'_id', as:'myField'}},
{$unwind: {path: '$myField', preserveNullAndEmptyArrays: true}},
{$project: {
...other properties...
myField: {
id: '$myField._id',
...other properties...
}}},
{$lookup: {from: 'C', localField: 'myField.nextField', foreignField: '_id', as: 'myField.nextField'}},
{$unwind: {'path': '$myField.nextField', 'preserveNullAndEmptyArrays': true}},
{$addFields: {'myField.nextField.id': {$toString: '$myField.nextField._id'}}},
{$project: {'myField.nextField': {...exclusions...}}},
{ "$group": {
"_id": "$_id",
myField: {$push: '$myField'}
...inclusions...
}},
])
基本上,myField是否存在并不重要,mongo会将myField.nextField.id设置为null,而不是首先不在myField数组中包含nextField。
有办法避免这种情况吗?
还有一种方法可以避免该组中的最后一个包含列表?实际上,我只是将联接的字段推回数组中,而我的文档很大,因此将它们全部列出来是很痛苦的。