sourcetip

$196 결과의 $일치

fileupload 2023. 6. 27. 22:29
반응형

$196 결과의 $일치

다음 몽고 코드가 있습니다.

db.users.aggregate([
    { 
        $match: { 
            $and: [
                { UserName: { $eq: 'administrator' } }, 
                { 'Company.CompanyName': { $eq: 'test' } }
            ]                   
        } 
    },
    { 
        $lookup: { 
            from: "companies", 
            localField: "CompanyID", 
            foreignField: "CompanyID", 
            as: "Company" 
        } 
    },
])

$lookup코드의 일부가 잘 작동합니다.다음 결과가 나왔습니다.

enter image description here enter image description here

하지만 제가 덧붙이자면$match코드에는, 아무것도 가져오지 않습니다.

두 번째 매치에서 문제가 발생했습니다.{ 'Company.CompanyName': { $eq: 'test' } }하지만 저는 그것에 무엇이 문제인지 깨닫지 못합니다.아이디어 있어요?

업데이트:

저도 노력했습니다.$unwind에서$lookup결과, 하지만 운이 없습니다.

db.users.aggregate([
    { 
        $match: { 
            $and: [
                { UserName: { $eq: 'administrator' } }, 
                { 'Company.CompanyName': { $eq: 'edt5' } }
            ] 
        } 
    },
    {   unwind: '$Company' },
    { 
        $lookup: { 
            from: 'companies', 
            localField: 'CompanyID', 
            foreignField: 'CompanyID', 
            as: 'Company' 
        } 
    },
])

MongoDB 3.4를 사용하면 파이프라인을 사용하는 집계 파이프라인과 연산자를 실행하여 다음을 반환할 수 있습니다.Company지정된 조건과 일치하는 요소가 있는 배열입니다.그런 다음 연산자로 식을 래핑하여 기본적으로 배열을 평평하게 하여 기능을 통합하는 단일 문서를 반환할 수 있습니다.

위의 개념을 이해하려면 다음 예를 따르십시오.

db.users.aggregate([
    { "$match": { "UserName": "administrator" } },
    { 
        "$lookup": { 
            "from": 'companies', 
            "localField": 'CompanyID', 
            "foreignField": 'CompanyID', 
            "as": 'Company' 
        } 
    },
    {
        "$addFields": {
            "Company": {
                "$arrayElemAt": [
                    {
                        "$filter": {
                            "input": "$Company",
                            "as": "comp",
                            "cond": {
                                "$eq": [ "$$comp.CompanyName", "edt5" ]
                            }
                        }
                    }, 0
                ]
            }
        }
    }
])

아래 답변은 mongoDB 3.6 이상용입니다.

다음과 같은 경우:

  • 컬렉션이 있습니다.users들판과 함께CompanyID및 의 컬렉션companies들판과 함께CompanyID
  • 조회할 항목CompaniesUsers일치하여CompanyID여기서 추가:

    • 각 사용자는 조건과 일치해야 합니다.User.UserName동등한administrator
    • 각각CompanyUser조건과 일치해야 합니다.CompanyName동등한edt5

다음 쿼리를 사용할 수 있습니다.

  db.users.aggregate([
    { $match: { UserName: 'administrator' } },
    {
      $lookup: {
        from: 'companies',
        as: 'Company',
        let: { CompanyID: '$CompanyID' },
        pipeline: [
          {
            $match: {
              $expr: {
                $and: [
                  { $eq: ['$CompanyID', '$$CompanyID'] },
                  { $eq: ['$CompanyName', 'edt5'] },
                ]
              }
            }
          }
        ]
      }
    },
  ])

설명:이것은 단순한 외부/로컬 필드 동등성 일치보다 복잡한 조건을 가진 왼쪽 조인 쿼리를 수행하는 방법입니다.

사용하는 대신localField그리고.foreignField사용:

  • let로컬 필드를 변수에 매핑할 수 있는 옵션,
  • pipeline집계를 지정할 수 있는 옵션Array.

pipeline사용할 수 있습니다.$match필터, 사용$expr앞에서 정의한 변수를 다시 사용할 수 있습니다.let.

$lookup에 대한 자세한 정보

좋은 튜토리얼

여기 룩업 내부 배열을 피터링하기 위한 코드가 있습니다.

 const userId = req.userData.userId;
const limit = parseInt(req.params.limit);
const page = parseInt(req.params.page);

Collection.aggregate([
 { $match: {} },
  { $sort: { count: -1 } },
  { $skip: limit * page },
  { $limit: limit },
  {
    $lookup: {
      from: Preference.collection.name,
      let: { keywordId: "$_id" },
      pipeline: [
        {
          $match: {
            $expr: {
              $and: [
                { $eq: ["$keyword", "$$keywordId"] },
                {
                  $eq: ["$user", mongoose.Types.ObjectId(userId)],
                },
              ],
            },
          },
        },
      ],
      as: "keywordData",
    },
  },
  {
    $project: {
      _id: 0,
      id: "$_id",
      count: 1,
      for: 1,
      against: 1,
      created_at: 1,
      updated_at: 1,
      keyword: 1,
      selected: {
        $cond: {
          if: {
            $eq: [{ $size: "$keywordData" }, 0],
          },
          then: false,
          else: true,
        },
      },
    },
  }])

언급URL : https://stackoverflow.com/questions/42091088/match-in-lookup-result

반응형