$ ifNull避免将字段添加到聚合中

时间:2019-06-17 14:47:29

标签: mongodb aggregation projection

我在我的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。

有办法避免这种情况吗?

还有一种方法可以避免该组中的最后一个包含列表?实际上,我只是将联接的字段推回数组中,而我的文档很大,因此将它们全部列出来是很痛苦的。

0 个答案:

没有答案