source

조건이 있는 Mongodb 집계 조회

lovecheck 2023. 7. 16. 13:39
반응형

조건이 있는 Mongodb 집계 조회

라는 컬렉션이 있습니다.article_category어느 가게나article_id의 범주에 속함category_id이와 같은 데이터 형식을 사용합니다.

컬렉션 1: 아티클_카테고리

{
  "article_id": 2015110920343902,
  "all_category_id": [5,8,10]
}

그리고 나는 다른 컬렉션을 가지고 있습니다.article내 모든 게시물을 저장하는 것.

컬렉션 2: 기사

{
  "title": "This is example rows in article collection"
  "article_id": 2015110920343902,
},
{
  "title": "Something change"
  "article_id": 2015110920343903,
},
{
  "title": "This is another rows",
  "article_id": 2015110920343904,
}

이제 MongoDB 쿼리를 수행하여 다음을 찾습니다.title와 함께regex하는 동안에category_id다음과 같아야 합니다.8여기 제 질문이 있지만 일이 아닙니다.

db.article.aggregate(
{
  $match: 
  {
    title: 
    {
       $regex: /example/
    }
  }
},
{
    $lookup:
       {
         from: "article_category",
         pipeline: [
            { $match: { category_id: 8 } }
         ],
         as: "article_category"
       }
  }
)

위의 쿼리는 일치하는 레코드만 표시합니다.regex에 필적하지 않는category_id.

감 잡히는 게 없어요?

우선, 그것은.all_category_id,것은 아니다.category_id둘째, 문서를 연결하지 않습니다. 모든 문서의 내용이 동일합니다.article_category마지막으로 범주가 일치하지 않는 기사를 필터링할 수 있습니다.조건부 파이프라인은 다음과 같습니다.

db.article.aggregate([
  { $match: {
      title: { $regex: /example/ }
  } },
  { $lookup: {
    from: "article_category",
    let: {
      article_id: "$article_id"
    },
    pipeline: [
      { $match: {
          $expr: { $and: [
              { $in: [ 8, "$all_category_id" ] },
              { $eq: [ "$article_id", "$$article_id" ] }
          ] }
      } }
    ],
    as: "article_category"
  } },
  { $match: {
    $expr: { $gt: [
      { $size: "$article_category"},
      0
    ] }
  } }
] )

업데이트:

일치하지 않는 경우article_id,그$lookup동일한 결과를 초래할 것입니다.article_category모든 물품의 배열

예를 들면 당신의article_category컬렉션에 다른 문서가 있습니다.

{
  "article_id": 0,
  "all_category_id": [5,8,10]
}

와 함께{ $eq: [ "$article_id", "$$article_id" ] }결과가 나오는 과정에서.article_category이라

[ 
  { 
    "article_id" : 2015110920343902, 
    "all_category_id" : [ 5, 8, 10 ] 
  } 
]

제외:

[ 
  { 
    "article_id" : 2015110920343902, 
    "all_category_id" : [ 5, 8, 10 ] 
  },
  {
    "article_id": 0,
    "all_category_id": [ 5, 8, 10 ]
  }
]

후자가 필요한 경우 요청을 찾는 것이 훨씬 더 간단합니다.

db.article.find({ title: { $regex: /example/ } })

그리고.

db.article_category.find({ all_category_id: 8 })

당신은 여기서 몇 가지 잘못된 것을 가지고 있습니다. category_id그래야 한다all_category_id가입 조건 사용$lookup그리고 이동합니다.$match이외에$lookup로 무대에 서다.$unwind조회용의

사용하다$project검색된 필드를 최종 응답에서 제외합니다.비슷한 것{$project:{article_category:0}}

해라

db.article.aggregate([
  {"$match":{"title":{"$regex":/example/}}},
  {"$lookup":{
    "from":"article_category",
    "localField":"article_id",
    "foreignField":"article_id",
    "as":"article_category"
  }},
  {"$unwind":"$article_category"},
  {"$match":{"article_category.all_category_id":8}}
])

상관되지 않은 하위 쿼리 시도

db.article.aggregate([
  {"$match":{"title":{"$regex":/example/}}},
  {"$lookup":{
    "from":"article_category",
    "pipeline":[{"$match":{"all_category_id":8}}],
    "as":"categories"
  }},
  {"$match":{"categories":{"$ne":[]}}}
])

언급URL : https://stackoverflow.com/questions/48518215/mongodb-aggregation-lookup-with-conditions

반응형