programing

Mongo $lookup이 왼쪽 외부 조인이라면 일치하지 않는 문서를 제외하는 이유는 무엇입니까?

lovejava 2023. 7. 3. 22:27

Mongo $lookup이 왼쪽 외부 조인이라면 일치하지 않는 문서를 제외하는 이유는 무엇입니까?

제목이 모든 것을 말해줍니다.문서가 일치 필드에 따라 일치하는 외부 문서를 생성하지 않는 경우, 파이프라인의 결과 집합에 포함되지 않는 이유는 무엇입니까?

저는 Mongo 3.2의 새로운 애그리게이터를 테스트하고 있으며, 먼저 압축을 푼 다음 문서를 그룹화하여 중첩된 배열 검색을 수행하기까지 했습니다.제게 남은 것은 결과를 충족하지 못한 모든 현지 문서를 포함시키는 것입니다.$lookup기준, 이것이 "좌측 외측 결합"의 표준 정의라고 생각했습니다.

질문은 다음과 같습니다.

db.users.aggregate([
    {
        $unwind: "$profile",
        $unwind: "$profile.universities"
    },
    {
        $lookup: {
            from: "universities",
            localField: "profile.universities._id",
            foreignField: "_id",
            as: "profile.universities"
        }
    },
    {
        $group: {
            _id: "$_id",
            universities: {
                $addToSet: "$profile.universities"
            }
        }
    }
]).pretty()

그래서 제가 만약에.user그것은 비어 있습니다.profile.universities배열, 그러면 나는 그것이 그것과 상관없이 결과 세트에 포함되어야 합니다.$lookup일치하는 항목을 반환하지만 반환하지 않습니다.내가 어떻게 이걸 할 수 있을까, 그리고 Mongo가 만든 이유는.$lookup이런 식으로 운영할 수 있습니까?

이 동작은 다음과 관련이 없습니다.$lookup참조된 필드가 없거나 배열이 비어 있는 문서를 생략하는 것이 기본 동작이기 때문입니다.

다음과 같은 경우에도 손상되지 않은 문서를 보존하기 위해profile.universities빈 배열입니다. 설정할 수 있습니다.preserveNullAndEmptyArrays에 대한 선택권.true:

db.users.aggregate([
    {
        $unwind: "$profile",
        $unwind: {
            path: "$profile.universities",
            preserveNullAndEmptyArrays: true
        }
    },
    {
        $lookup: {
            from: "universities",
            localField: "profile.universities._id",
            foreignField: "_id",
            as: "profile.universities"
        }
    },
    {
        $group: {
            _id: "$_id",
            universities: {
                $addToSet: "$profile.universities"
            }
        }
    }
]).pretty()

언급URL : https://stackoverflow.com/questions/39479875/if-mongo-lookup-is-a-left-outer-join-then-how-come-it-excludes-non-matching-do