MongoDB中的完全外连接

时间:2017-08-22 05:51:45

标签: mongodb join outer-join nosql

我想通过查找mongoDB查询在MongoDB中进行全外连接。这可能吗? MongoDB是否支持Full Outer Join以任何其他方式?

[更新:]

我想从Collection1&amp ;; Collection2如下附件:

示例:Result Required

在上面的结果列中,可能有不同的算术运算,并将进一步用于计算。

3 个答案:

答案 0 :(得分:0)

我将集合命名为coll1和coll2,然后使用此查询,它将为您提供所需的输出。

db.getCollection('coll1').aggregate([
    {
        $facet: {
            commonRecords: [{
                    $lookup: {
                        from: "coll2",
                        localField: 'name',
                        foreignField: 'name',
                        as: "coll2"
                    }
                },
                {
                    $unwind: {
                        path: '$coll2',
                        preserveNullAndEmptyArrays: true
                    }
                }
            ]
        }
    },
    {
        $lookup: {
            from: "coll2",
            let: {
                names: {
                    $map: {
                        input: '$commonRecords',
                        as: 'commonRecord',
                        in: '$$commonRecord.name'
                    }
                }
            },
            pipeline: [{
                $match: {
                    $expr: {
                        $eq: [{
                            $indexOfArray: ['$$names', '$name']
                        }, -1]
                    }
                }
            }, ],
            as: "coll2"
        }
    },
    {
        $addFields: {
            coll2: {
                $map: {
                    input: '$coll2',
                    as: 'doc',
                    in: {
                        coll2: '$$doc'
                    }
                }
            }
        }
    },
    {
        $project: {
            records: {
                $concatArrays: ['$commonRecords', '$coll2']
            }
        }
    },
    {
        $unwind: '$records'
    },
    {
        $replaceRoot: {
            newRoot: '$records'
        }
    },
    {
        $project: {
            _id: 0,
            name: {
                $ifNull: ['$name', '$coll2.name']
            },
            marks1: {
                $ifNull: ['$marks', 0]
            },
            marks2: {
                $ifNull: ['$coll2.marks', 0]
            }
        }
    },
    {
        $addFields: {
            result: {
                $add: ['$marks1', '$marks2']
            }
        }
    }
])

答案 1 :(得分:0)

这是一个示例:

    {
       $lookup:
         {
           from: [collection to join],
           local_Field: [field from the input documents],
           foreign_Field: [field from the documents of the "from" collection],
           as: [output field]
         }
    }

显示this链接

答案 2 :(得分:0)

你可以使用 $unionWith (从 4.4 开始) 像这样:

db.c1.aggregate([
{$set: {
  mark1: "$marks"
}}, 
{$unionWith: {
  coll: 'c2',
  pipeline: [{$set: {mark2: "$marks"}}]
}}, 
{$group: {
  _id: "$name",
  result: {
    $sum: "$marks"
  },
  mark1: {$first: {$ifNull: ["$mark1", 0]}},
  mark2: {$first: {$ifNull: ["$mark2", 0]}}
}}])