교차하는 하위 컬렉션이있는 mongo 컬렉션의 항목을 어떻게 세나요?

니콜라이 주리 코프

내 컬렉션의 모든 항목에 대해 교차하는 하위 컬렉션이있는 다른 항목의 수를 찾아야합니다. 예를 들어이 컬렉션이

[{id:1,"sub":[1, 2, 3]},
{id:2,"sub":[2, 3, 4]},
{id:3,"sub":[4, 5, 6],
{id:4,"sub":[7, 8, 9]}]

예상 결과는

[{id:1,"count":1},
{id:2,"count":2},
{id:3,"count":1},
{id:4,"count":0"}]
mickl

순수 MongoDB 쿼리 언어의 알고리즘으로 시작 : 각 문서에 초기 sub배열과 다른 모든 sub의 배열이 포함되도록 문서를 재구성해야 합니다. 이렇게하려면 $ unwind 와 함께 $ group 을 실행해야합니다 . 그러면 $ setIntersect를 사용 하여 $ map실행하는 것이 쉬워집니다. $ filter 모든 비어 있고 자체 배열과 동일하며 $ size를 사용하여 크기를 가져옵니다.

db.collection.aggregate([
    {
        $group: {
            _id: null,
            current: { $push: "$$ROOT" },
            all: { $push: "$sub" }
        }
    },
    {
        $unwind: "$current"
    },
    {
        $project: {
            id: "$current.id",
            count: {
                $size: {
                    $filter: {
                        input: {
                            $map: {
                                input: "$all",
                                in: { $setIntersection: [ "$$this", "$current.sub" ] }
                            }
                        },
                        cond: {
                            $and: [ 
                                { $ne: [ "$$this", [] ] },
                                { $ne: [ "$$this", "$current.sub" ]}
                            ]
                        }
                    }
                }
            }
        }
    }
])

몽고 놀이터

집계가 매우 복잡하기 때문에 C #에서 강력한 형식으로 실행하는 것은 의미가 없습니다. 할 수있는 일은 BsonDocument클래스를 사용하여 다음과 같은 파이프 라인을 구축하는 것입니다.

var groupDef = new BsonDocument()
        {
            { "_id", "" },
            { "current", new BsonDocument(){ { "$push", "$$ROOT" } } },
            { "all", new BsonDocument(){ { "$push", "$sub" } } },
        };

var projectDef = BsonDocument.Parse(@"{
        id: ""$current.id"",
        _id: 0,
        count: {
        $size: {
            $filter: {
            input: {
                $map: {
                input: ""$all"",
                in: {
                    $setIntersection: [
                    ""$$this"",
                    ""$current.sub""
                    ]
                }
                }
            },
            cond: {
                $and: [
                {
                    $ne: [
                    ""$$this"",
                    []
                    ]
                },
                {
                    $ne: [
                    ""$$this"",
                    ""$current.sub""
                    ]
                }
                ]
            }
            }
        }
        }
    }");

var result = mongoDBCollection.Aggregate()
                                .Group(groupDef)
                                .Unwind("current")
                                .Project(projectDef)
                                .ToList();

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

특수 속성이있는 컬렉션을 어떻게 삭제하나요?

분류에서Dev

Mongo 컬렉션의 모든 항목을 제거하는 방법

분류에서Dev

B와 함께 외국인이있는 컬렉션 A, 컬렉션 C를 가진 외국인이있는 컬렉션, A에서 컬렉션 C로 외국인을 데려 오려면 어떻게해야하나요? (집계)

분류에서Dev

컬렉션의 하위 항목을 나열합니다.

분류에서Dev

삭제 된 컬렉션의 문서 및 하위 컬렉션은 어떻게 되나요?

분류에서Dev

별매 품 컬렉션의 판매 표는 어떻게 구성하나요?

분류에서Dev

Firestore 컬렉션의 각 데이터에 대한 구독을 추가하려면 어떻게해야하나요?

분류에서Dev

Meteor와 함께 Mongo 컬렉션의 모든 것을 드롭하세요

분류에서Dev

C # Generics : 2 개의 컬렉션이 동일한 유형을 포함해야하지만 컬렉션이 동일한 유형일 필요는없는 제네릭을 어떻게 선언 할 수 있습니까?

분류에서Dev

하위 배열의 다른 컬렉션에있는 속성을 어떻게 호출 할 수 있습니까?

분류에서Dev

일치하는 항목을 위해 다른 컬렉션의 컬렉션 업데이트

분류에서Dev

Meteor.js-다른 mongo 컬렉션이 변경되면 자동으로 하나의 Mongo 컬렉션을 업데이트합니까?

분류에서Dev

mongo 스크립트로 비슷한 이름의 컬렉션을 빠르게 제거하는 방법

분류에서Dev

어떻게지도 값이 컬렉션은 값의 크기에 의해지도 항목을 정렬하려면?

분류에서Dev

Meteor의 mongo 컬렉션 요소에서 차트 목록을 만드는 방법

분류에서Dev

두 개의 mongo 컬렉션을 병합하려면 어떻게해야합니까?

분류에서Dev

늘어나는 동영상 컬렉션을 어떻게 저장해야하나요?

분류에서Dev

컬렉션 (ListView)이있는 Android 위젯이 항목을 표시하지 않음

분류에서Dev

탭바 항목으로 액션을 시도 할 때 신속하게 아울렛이나 아울렛 컬렉션 만 만들 수 있습니다. 어떻게 액션을 할 수 있나요?

분류에서Dev

녹아웃, 컬렉션 속성에 항목이 둘 이상있는 경우 하나의 항목을 제거하려고하면 null이됩니까?

분류에서Dev

Google Cloud Firestore에서 프로젝트의 모든 컬렉션을 삭제하려면 어떻게하나요?

분류에서Dev

Django Rest Api에서 컬렉션을 어떻게 삭제하나요?

분류에서Dev

mongo 쿼리 / 컬렉션에서 레코드의 위치를 어떻게 얻을 수 있습니까?

분류에서Dev

세트 컬렉션의 항목을 현재 날짜와 비교하는 방법은 무엇입니까?

분류에서Dev

mongo 컬렉션의 배열에 하나의 값을 추가하는 스크립트

분류에서Dev

어떻게 hamcrest의 컬렉션에 크기와 일부 항목의 존재 여부를 확인하는 방법

분류에서Dev

각각 다른 개체 컬렉션을 포함하는 개체 컬렉션에 LINQ를 통해 List <string>의 모든 값이 포함되어 있는지 확인

분류에서Dev

QueryDSL을 사용하여 하위 항목이 모든 기준과 일치하는 컬렉션에서 식을 어떻게 생성합니까?

분류에서Dev

키를 기반으로 Laravel 컬렉션의 항목을 병합하려면 어떻게해야합니까?

Related 관련 기사

  1. 1

    특수 속성이있는 컬렉션을 어떻게 삭제하나요?

  2. 2

    Mongo 컬렉션의 모든 항목을 제거하는 방법

  3. 3

    B와 함께 외국인이있는 컬렉션 A, 컬렉션 C를 가진 외국인이있는 컬렉션, A에서 컬렉션 C로 외국인을 데려 오려면 어떻게해야하나요? (집계)

  4. 4

    컬렉션의 하위 항목을 나열합니다.

  5. 5

    삭제 된 컬렉션의 문서 및 하위 컬렉션은 어떻게 되나요?

  6. 6

    별매 품 컬렉션의 판매 표는 어떻게 구성하나요?

  7. 7

    Firestore 컬렉션의 각 데이터에 대한 구독을 추가하려면 어떻게해야하나요?

  8. 8

    Meteor와 함께 Mongo 컬렉션의 모든 것을 드롭하세요

  9. 9

    C # Generics : 2 개의 컬렉션이 동일한 유형을 포함해야하지만 컬렉션이 동일한 유형일 필요는없는 제네릭을 어떻게 선언 할 수 있습니까?

  10. 10

    하위 배열의 다른 컬렉션에있는 속성을 어떻게 호출 할 수 있습니까?

  11. 11

    일치하는 항목을 위해 다른 컬렉션의 컬렉션 업데이트

  12. 12

    Meteor.js-다른 mongo 컬렉션이 변경되면 자동으로 하나의 Mongo 컬렉션을 업데이트합니까?

  13. 13

    mongo 스크립트로 비슷한 이름의 컬렉션을 빠르게 제거하는 방법

  14. 14

    어떻게지도 값이 컬렉션은 값의 크기에 의해지도 항목을 정렬하려면?

  15. 15

    Meteor의 mongo 컬렉션 요소에서 차트 목록을 만드는 방법

  16. 16

    두 개의 mongo 컬렉션을 병합하려면 어떻게해야합니까?

  17. 17

    늘어나는 동영상 컬렉션을 어떻게 저장해야하나요?

  18. 18

    컬렉션 (ListView)이있는 Android 위젯이 항목을 표시하지 않음

  19. 19

    탭바 항목으로 액션을 시도 할 때 신속하게 아울렛이나 아울렛 컬렉션 만 만들 수 있습니다. 어떻게 액션을 할 수 있나요?

  20. 20

    녹아웃, 컬렉션 속성에 항목이 둘 이상있는 경우 하나의 항목을 제거하려고하면 null이됩니까?

  21. 21

    Google Cloud Firestore에서 프로젝트의 모든 컬렉션을 삭제하려면 어떻게하나요?

  22. 22

    Django Rest Api에서 컬렉션을 어떻게 삭제하나요?

  23. 23

    mongo 쿼리 / 컬렉션에서 레코드의 위치를 어떻게 얻을 수 있습니까?

  24. 24

    세트 컬렉션의 항목을 현재 날짜와 비교하는 방법은 무엇입니까?

  25. 25

    mongo 컬렉션의 배열에 하나의 값을 추가하는 스크립트

  26. 26

    어떻게 hamcrest의 컬렉션에 크기와 일부 항목의 존재 여부를 확인하는 방법

  27. 27

    각각 다른 개체 컬렉션을 포함하는 개체 컬렉션에 LINQ를 통해 List <string>의 모든 값이 포함되어 있는지 확인

  28. 28

    QueryDSL을 사용하여 하위 항목이 모든 기준과 일치하는 컬렉션에서 식을 어떻게 생성합니까?

  29. 29

    키를 기반으로 Laravel 컬렉션의 항목을 병합하려면 어떻게해야합니까?

뜨겁다태그

보관