我有一个对象数据库,其结构有点类似于以下内容:
{
"processID": value,
"upstreamAppName": Name,
"upstreamAppID": ID,
"downstreamAppName": Name,
"downstreamAppID": ID
}
我想基于名称和ID将所有应用分组,无论是上游还是下游。我想通过对{ "$upstreamAppName", "$upstreamAppID" }
的所有唯一组合进行分组,对{ "$downstreamAppName", "$downstreamAppID" }
的所有唯一组合进行分组,然后获得这两个集合的并集来完成此操作。有人告诉我可以用来完成此操作的查询吗?
答案 0 :(得分:1)
您可以使用$facet和$setUnion来实现,请尝试以下查询:
db.collection.aggregate([
{
$facet: {
"upstream": [{ $group: { _id: { AppName: '$upstreamAppName', AppID: '$upstreamAppID' } } }, { $group: { _id: '', upstreamArr: { $push: '$$ROOT._id' } } }],
"downstream": [{ $group: { _id: { AppName: '$downstreamAppName', AppID: '$downstreamAppID' } } }, { $group: { _id: '', downstreamArr: { $push: '$$ROOT._id' } } }]
}
}, { $unwind: '$upstream' }, { $unwind: '$downstream' }, { $project: { unionOfStreams: { $setUnion: ['$upstream.upstreamArr', '$downstream.downstreamArr'] } } }])
注意::此外,您可以在各个{$project : {_id :0, upstreamAppName:1,upstreamAppID:1 }},
阶段之前添加{$project : {_id :0, downstreamAppName:1,downstreamAppID:1 }}
和$group
,以优化查询。