programing

$lookup을 사용한 MongoDB 집계는 쿼리에서 반환할 일부 필드만 포함(또는 프로젝트)합니다.

subpage 2023. 5. 24. 22:08
반응형

$lookup을 사용한 MongoDB 집계는 쿼리에서 반환할 일부 필드만 포함(또는 프로젝트)합니다.

몽고에서, 한 후에.aggregation와 함께$lookup저는 전체 문서가 아닌 일부 필드만 반환 요청을 원합니다.

다음과 같은 질문이 있습니다.

db.somecollection.aggregate([{
    $lookup: {
        from: "campaigns",
        localField: "campId",
        foreignField: "_id",
        as: "campaign"
    }
}, {
    $unwind: "$campaign"
}, {
    $lookup: {
        from: "entities",
        localField: "campaign.clientid",
        foreignField: "_id",
        as: "campaign.client"
    }
}]);

이 요청은 다음을 반환합니다.

{
"_id" : ObjectId("56cc7cd1cc2cf62803ebfdc7"),
"campId" : ObjectId("56c740e4479f46e402efda84"),
"articleId" : ObjectId("56c742c06094640103ba3843"),
"campaign" : {
    "_id" : ObjectId("56c740e4479f46e402efda84"),
    "clientid" : ObjectId("56c740b8479f46e402efda83"),
    "client" : [
        {
            "_id" : ObjectId("56c740b8479f46e402efda83"),
            "username" : "someusername",
            "shhh" : "somehashedpassword",
            "email" : "mail@mail.com",
        }
    ]
}

요청은 잘 작동하지만 다음 필드를 필터링하고 싶습니다.campaign.client예를 들면,_id그리고.usernameMongoDB에서 이것을 할 수 있는 방법이 있습니까?aggregate요청?

@SiddhartAjmera가 정답을 알고 있기 때문에 "campaign.clientid"와 같은 중첩 값에 큰따옴표를 추가하면 됩니다.

최종 코드는 다음과 같습니다.

db.somecollection.aggregate([
      {
        "$lookup": {
          "from": "campaigns",
          "localField": "campId",
          "foreignField": "_id",
          "as": "campaign"
        }
      },
      {
        "$unwind": "$campaign"
      },
      {
        "$lookup": {
          "from": "entities",
          "localField": "campaign.clientid",
          "foreignField": "_id",
          "as": "campaign.client"
        }
      },
      {
        "$project": {
          "_id": 1,
          "campId": 1,
          "articleId": 1,
          "campaign._id": 1,
          "campaign.clientid": 1,
          "campaign.client._id": 1,
          "campaign.client.username": 1
        }
      }
]);

사용.pipeline그리고.$project안에서.$lookup

db.somecollection.aggregate([{
    $lookup: {
        from: "campaigns",
        localField: "campId",
        foreignField: "_id",
        as: "campaign"
    }
}, {
    $unwind: "$campaign"
}, {
    $lookup: {
        from: "entities",
        let: { client_id: "$campaign.clientid" },    
        pipeline : [
            { $match: { $expr: { $eq: [ "$_id", "$$client_id" ] } }, },
            { $project : { _id:1, username:1 } }
        ],
        as: "campaign.client"
    }
}]);

앞의 답변에 약간의 추가 사항이 있습니다.무시할 프로젝트 항목에 0을 지정하면 나머지 항목이 검색되므로 목록을 모두 1로 작성할 필요가 없습니다.

db.somecollection.aggregate([
  {
    "$lookup": {
      "from": "campaigns",
      "localField": "campId",
      "foreignField": "_id",
      "as": "campaign"
    }
  },
  {
    "$unwind": "$campaign"
  },
  {
    "$lookup": {
      "from": "entities",
      "localField": "campaign.clientid",
      "foreignField": "_id",
      "as": "campaign.client"
    }
  },
  {
    "$project": {
      "campaign.client.shhh": 0
    }
  }
])

저는 이 질문에 대답하기가 매우 늦었다는 것을 알고 있습니다.하지만 제 생각에는 업데이트가 때로는 매우 유익한 것으로 판명될 수 있습니다.
프로젝트 단계는 훌륭하지만 당신은 여전히 전체 부두에 대한 요청을 하고 있을 것입니다.$lookupstage. 필드는 다음에 오는 투영 단계에서만 필터링됩니다.

MongoDB 3.6 릴리스 이후에 이제 다음에 파이프라인을 추가할 수 있습니다.$lookup단계: 다중 조인 조건을 지정합니다.자세한 내용은 공식 문서를 참조하십시오.
$lookup을 사용하여 다중 조인 조건 지정

다음과 같이 집계 파이프라인을 변환하여 원하는 결과를 얻을 수 있습니다.

db.somecollection.aggregate([{
    $lookup: {
        from: "campaigns",
        localField: "campId",
        foreignField: "_id",
        as: "campaign"
    }
}, {
    $unwind: "$campaign"
}, {
    $lookup: {
        from: "entities",
        let: {clientid: '$campaign.clientid'},
        pipeline: [
           { '$match': 
             { '$expr': 
               { 
                  '$eq': ['$_id', '$$clientid']   
               }
             }
           },
           { '$project': 
              '_id': 1,
              'username': 1
           }
        ]
        as: "campaign.client"
    }
}]);

이렇게 하면 바로 내부에 있는 조인된 컬렉션의 필드를 필터링할 수 있습니다.$lookup단계.
주의:$$내부의 간판$match내부 파이프라인의 단계.내부에 정의된 사용자 정의 필드를 나타내는 데 사용됩니다.let블록으로 막다

언급URL : https://stackoverflow.com/questions/35583569/mongodb-aggregation-with-lookup-only-include-or-project-some-fields-to-return

반응형