중첩 된 배열 내에서 하위 문서 요소 만 일치하는 경우 문서 반환

Sreejith Ms

기본 컬렉션은 User 이며 경험 세부 정보 및 기타 항목 이있는 사용자 프로필 컬렉션이 있습니다. 또한 스킬 컬렉션이 있습니다.

사용자

[{
    "_id": "5f1eef8ec68d306fbbf13b0f",
    "name": "John Davis",
    "email": "[email protected]",
    "__v": 0
},
{
    "_id": "9q1eef8ec68d306fbbf13bh6",
    "name": "Mik Luca",
    "email": "[email protected]",
    "__v": 0
}]

유저 프로필

[{
        "_id": "5f1eef8ec68d306fbbf13b10",
        "other_skills": [
            null
        ],
        "user_id": "5f1eef8ec68d306fbbf13b0f",
        "phone_number": "1234569870",
        "location": "5f16b72617fee02922688751",
        "primary_skills": [
            {
                "_id": "5f32635cf764cc40447503a6",
                "years": 1,
                "skill_id": "5f0da75907a96c3040b3667d"
            }
        ]
    },
    {
        "_id": "5f1eef8ec68d306fbbf13b10",
        "other_skills": [
            null
        ],
        "user_id": "9q1eef8ec68d306fbbf13bh6",
        "phone_number": "1234569870",
        "location": "5f16b72617fee02922688751",
        "primary_skills": [
            {
                "_id": "6s0da75907a96c3040b36690",
                "years": 1,
                "skill_id": "5f0da75907a96c3040b3667d"
            }
        ]
    }]

기술

[{  
    "_id": "5f0da75907a96c3040b3667d",
    "skill": "Mongo"
},
{  
    "_id": "6s0da75907a96c3040b36690",
    "skill": "Node"
}]

사용자 프로필 정보와 함께 사용자를 나열하고 기술로도 필터링해야합니다.

나는 시도했다

db.getCollection("users").aggregate(
    [
        { 
            "$project" : { 
                "_id" : NumberInt(0), 
                "users" : "$$ROOT"
            }
        }, 
        { 
            "$lookup" : { 
                "localField" : "users._id", 
                "from" : "userprofiles", 
                "foreignField" : "user_id", 
                "as" : "userprofiles"
            }
        }, 
        { 
            "$unwind" : { 
                "path" : "$userprofiles", 
                "preserveNullAndEmptyArrays" : true
            }
        }, 
        { 
            "$lookup" : { 
                "localField" : "userprofiles.primary_skills.skill_id", 
                "from" : "skills", 
                "foreignField" : "_id", 
                "as" : "skills"
            }
        }, 
        { 
            "$unwind" : { 
                "path" : "$skills", 
                "preserveNullAndEmptyArrays" : true
            }
        }, 
        { 
            "$match" : { 
                "skills._id" : ObjectId("5f0dce8d07a96c3040b36687")
            }
        }
    ], 
    { 
        "allowDiskUse" : true
    }
);

그러나 적절한 결과를 얻지 못했습니다.

사용자 목록으로 사용자 프로필기술 정보를 채우고 기술 ID로 사용자 목록을 필터링하려면 어떻게해야합니까?

인사와 감사합니다.

투리 비살

파이프 라인으로 조회를 사용하여 조회 내에서 필터를 일치시킬 수 있습니다.

  • $lookupuserProfile수집
  • $match프로필 ID와 일치하는 파이프 라인
  • skill_id여기에 일치 와 같은 프로필에 대한 다른 필터
  • $unwind해체 primary_skills우리가 skill_id에 조회하려고하기 때문에 배열을
  • $lookupskills컬렉션
  • $unwindprimary_skills.skill_id배열을 객체로 필요하기 때문에 분해
  • $grpupprimary_skills배열 재구성
  • $matchuserProfiles비어 있지 않은 경우[]
db.users.aggregate([
  {
    $lookup: {
      from: "usersProfile",
      let: { id: "$_id" },
      as: "userProfiles",
      pipeline: [
        {
          $match: { 
             $expr: { $eq: ["$$id", "$user_id"] },
             // match here user profile filters
            "primary_skills.skill_id": "5f0da75907a96c3040b3667d"
          }
        },
        { $unwind: "$primary_skills" },
        {
          $lookup: {
            from: "skills",
            localField: "primary_skills.skill_id",
            foreignField: "_id",
            as: "primary_skills.skill_id"
          }
        },
        { $unwind: "$primary_skills.skill_id" },
        {
          $group: {
            _id: "$_id",
            other_skills: { $first: "$other_skills" },
            phone_number: { $first: "$phone_number" },
            location: { $first: "$location" },
            primary_skills: {
              $push: {
                _id: "$primary_skills._id",
                skill: "$primary_skills.skill_id.skill",
                years: "$primary_skills.years"
              }
            }
          }
        }
      ]
    }
  },
  { $match: { userProfiles: { $ne: [] } } }
])

운동장

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

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

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Mongodb 배열 내에서 일치하는 요소 만 반환

분류에서Dev

중첩 된 객체 배열 내에서 일치하는 항목 반환

분류에서Dev

정의 된 배열 요소의 하위 문자열로 정의 된 범위에서 하위 배열 반환

분류에서Dev

중첩 된 for 루프 내에서 일치하는 문자열

분류에서Dev

MongoDB는 중첩 배열에서 일치하는 요소 만 가져옵니다.

분류에서Dev

중첩 된 문서에서 쿼리 된 요소와 그 부모 만 반환

분류에서Dev

MongoDB에서 배열에 중첩 된 하위 문서 제거

분류에서Dev

중첩 된 목록에서 요소가 누락 된 경우 맵을 사용하여 NA 반환

분류에서Dev

findOneAndUpdate (mongoose)는 모델에서 중첩 된 문서를 업데이트하는 경우 true를 반환하지만 업데이트 된 항목은 없습니다.

분류에서Dev

mongoose로 중첩 된 json 문서에서 하나의 요소 만 업데이트

분류에서Dev

문이 충돌하는 경우 중첩 된 배치 파일

분류에서Dev

MongoDB-배열에서 중첩 된 배열 요소를 제거하는 방법

분류에서Dev

Elasticsearch : 중첩 된 객체 필드가 용어 값과 일치하는 경우 문서를 반환하지 않습니다

분류에서Dev

MongoDB : 객체에 중첩 된 다른 배열에 중첩 된 배열의 첫 번째 요소 만 반환하도록 투영을 만듭니다.

분류에서Dev

PHPMongo-MongoDB에서 일치하는 포함 된 문서 만 찾아서 반환

분류에서Dev

변경 스트림 (Node.js)을 사용하여 문서에서 중첩 된 배열 요소의 델타 가져 오기

분류에서Dev

MongoDB 배열 쿼리는 배열의 대부분의 요소와 일치하는 문서를 반환합니다.

분류에서Dev

중첩 배열 검색 및 일치하는 값에서 키 반환

분류에서Dev

하위 문서 쿼리 및 일치하는 하위 문서 만 반환

분류에서Dev

중첩 된 [While, IF, Sed] 문에서 다른 파일의 줄과 일치하는 경우 줄 바꾸기

분류에서Dev

Twitter Typeahead.js 문자열 내에서 일치하는 모든 요소를 반환하는 방법

분류에서Dev

Elasticsearch의 strings 배열에서 하나의 요소 만 반환

분류에서Dev

배열 기반 문서를 정렬하고 결과의 첫 번째 요소 만 반환하는 방법

분류에서Dev

mongoose를 사용하여 mongo 문서 내에서 중첩 된 배열의 모든 요소를 어떻게 삭제할 수 있습니까?

분류에서Dev

고유 키만 사용하면서 배열 내에 중첩 된 해시 병합

분류에서Dev

Mongodb : 중첩 된 객체 배열 내에서 필드를 변환하는 방법

분류에서Dev

JSON에서 하나의 데이터 만있는 경우 잘못된 배열을 반환

분류에서Dev

요소의 값과 JavaScript에서 반복 된 횟수로 하위 배열의 배열을 만듭니다.

분류에서Dev

배열에서 최소값을 제거하지만 중복 된 경우 한 번만 제거

Related 관련 기사

  1. 1

    Mongodb 배열 내에서 일치하는 요소 만 반환

  2. 2

    중첩 된 객체 배열 내에서 일치하는 항목 반환

  3. 3

    정의 된 배열 요소의 하위 문자열로 정의 된 범위에서 하위 배열 반환

  4. 4

    중첩 된 for 루프 내에서 일치하는 문자열

  5. 5

    MongoDB는 중첩 배열에서 일치하는 요소 만 가져옵니다.

  6. 6

    중첩 된 문서에서 쿼리 된 요소와 그 부모 만 반환

  7. 7

    MongoDB에서 배열에 중첩 된 하위 문서 제거

  8. 8

    중첩 된 목록에서 요소가 누락 된 경우 맵을 사용하여 NA 반환

  9. 9

    findOneAndUpdate (mongoose)는 모델에서 중첩 된 문서를 업데이트하는 경우 true를 반환하지만 업데이트 된 항목은 없습니다.

  10. 10

    mongoose로 중첩 된 json 문서에서 하나의 요소 만 업데이트

  11. 11

    문이 충돌하는 경우 중첩 된 배치 파일

  12. 12

    MongoDB-배열에서 중첩 된 배열 요소를 제거하는 방법

  13. 13

    Elasticsearch : 중첩 된 객체 필드가 용어 값과 일치하는 경우 문서를 반환하지 않습니다

  14. 14

    MongoDB : 객체에 중첩 된 다른 배열에 중첩 된 배열의 첫 번째 요소 만 반환하도록 투영을 만듭니다.

  15. 15

    PHPMongo-MongoDB에서 일치하는 포함 된 문서 만 찾아서 반환

  16. 16

    변경 스트림 (Node.js)을 사용하여 문서에서 중첩 된 배열 요소의 델타 가져 오기

  17. 17

    MongoDB 배열 쿼리는 배열의 대부분의 요소와 일치하는 문서를 반환합니다.

  18. 18

    중첩 배열 검색 및 일치하는 값에서 키 반환

  19. 19

    하위 문서 쿼리 및 일치하는 하위 문서 만 반환

  20. 20

    중첩 된 [While, IF, Sed] 문에서 다른 파일의 줄과 일치하는 경우 줄 바꾸기

  21. 21

    Twitter Typeahead.js 문자열 내에서 일치하는 모든 요소를 반환하는 방법

  22. 22

    Elasticsearch의 strings 배열에서 하나의 요소 만 반환

  23. 23

    배열 기반 문서를 정렬하고 결과의 첫 번째 요소 만 반환하는 방법

  24. 24

    mongoose를 사용하여 mongo 문서 내에서 중첩 된 배열의 모든 요소를 어떻게 삭제할 수 있습니까?

  25. 25

    고유 키만 사용하면서 배열 내에 중첩 된 해시 병합

  26. 26

    Mongodb : 중첩 된 객체 배열 내에서 필드를 변환하는 방법

  27. 27

    JSON에서 하나의 데이터 만있는 경우 잘못된 배열을 반환

  28. 28

    요소의 값과 JavaScript에서 반복 된 횟수로 하위 배열의 배열을 만듭니다.

  29. 29

    배열에서 최소값을 제거하지만 중복 된 경우 한 번만 제거

뜨겁다태그

보관