sourcecode

MongoDBs 집약 '$lookup'을 'findOne()'으로 사용하는 방법

copyscript 2023. 3. 20. 23:26
반응형

MongoDBs 집약 '$lookup'을 'findOne()'으로 사용하는 방법

여러분들도 아시겠지만find()결과 배열을 반환합니다.findOne()단순한 물건만 돌려주는 거죠

Angular는 큰 차이를 만들어냅니다.가는 대신{{myresult[0].name}}, 나는 간단하게 쓸 수 있다.{{myresult.name}}.

나는 그 것을 발견했다.$lookup집약 파이프라인의 메서드는 단일 개체 대신 결과 배열을 반환합니다.

예를 들어 다음 두 가지 콜레션이 있습니다.

users수집:

[{
  "firstName": "John",
  "lastName": "Smith",
  "country": 123
}, {
  "firstName": "Luke",
  "lastName": "Jones",
  "country": 321
}]

countries수집:

[{
  "name": "Australia",
  "code": "AU",
  "_id": 123
}, {
  "name": "New Zealand",
  "code": "NZ",
  "_id": 321
}]

나의 애그리게이트$lookup:

db.users.aggregate([{
  $project: {
    "fullName": {
      $concat: ["$firstName", " ", "$lastName"]
    },
    "country": "$country"
  }
}, {
  $lookup: {
    from: "countries",
    localField: "country",
    foreignField: "_id",
    as: "country"
  }
}])

조회 결과:

[{
  "fullName": "John Smith",
  "country": [{
    "name": "Australia",
    "code": "AU",
    "_id": 123
  }]
}, {
 "fullName": "Luke Jones",
 "country": [{
   "name": "New Zealand",
   "code": "NZ",
   "_id": 321
 }]
}]

위의 결과에서 알 수 있듯이, 각각은country다음과 같은 단일 개체가 아닌 배열입니다."country": {....}.

내가 어떻게 내 것을 가질 수 있을까?$lookup하나의 문서와 일치하기 때문에 배열 대신 단일 개체를 반환할 수 있습니까?

거의 완료되었으므로 파이프라인에 다른 단계를 추가하고 를 사용하여 어레이 내의 단일 요소를 반환해야 합니다.

db.users.aggregate(
    [
        {   "$project": {     
            "fullName": {       
                "$concat": [ "$firstName", " ", "$lastName"]     
            },
            "country": "$country"   
        }}, 
        { "$lookup": {     
                "from": "countries",     
                "localField": "country",     
                "foreignField": "_id",     
                "as": "countryInfo"   
        }}, 
        { "$project": { 
            "fullName": 1, 
            "country": 1, 
            "countryInfo": { "$arrayElemAt": [ "$countryInfo", 0 ] } 
        }} 
    ]
)

를 사용할 수도 있습니다."preserveNullAndEmptyArrays"

다음과 같은 경우:

 db.users.aggregate(
        [
            {   "$project": {     
                "fullName": {       
                    "$concat": [ "$firstName", " ", "$lastName"]     
                },
                "country": "$country"   
            }}, 
            { "$lookup": {     
                    "from": "countries",     
                    "localField": "country",     
                    "foreignField": "_id",     
                    "as": "countryInfo"   
            }}, 
            {"$unwind": {
                    "path": "$countryInfo",
                    "preserveNullAndEmptyArrays": true
                }
            },
        ]
    )
db.users.aggregate([
    {
        $lookup: {
            from: 'countries',
            localField: 'country',
            foreignField: '_id',
            as: 'country'
        }
    },
    {
        $unwind: '$country'
    }
]).pretty()

이 mongo 쿼리를 사용하여 국가 개체를 가져올 수 있습니다.

프로젝트의 모든 필드를 반복하지 않으려면 해당 필드를 $addFields로 덮어씁니다.

db.users.aggregate([
    {   "$project": {     
        "fullName": {       
            "$concat": [ "$firstName", " ", "$lastName"]     
        },
        "country": "$country"   
    }}, 
    { "$lookup": {     
        "from": "countries",     
        "localField": "country",     
        "foreignField": "_id",     
        "as": "countryInfo"   
    }},
    { "$addFields": {
        "countryInfo": {
            "$arrayElemAt": [ "$countryInfo", 0 ]
        }
    }}
])

가장 깨끗한 접근법은 파이프라인에 한 단계 더 추가하는 것이라고 생각합니다.

...,
{
  $addFields : {
    $country: { $first: '$country' }
  }
}

언급URL : https://stackoverflow.com/questions/37691727/how-to-use-mongodbs-aggregate-lookup-as-findone

반응형