조건이 있는 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
'source' 카테고리의 다른 글
Panda를 사용하여 기존 엑셀 파일에 새 시트를 저장하는 방법은 무엇입니까? (0) | 2023.07.16 |
---|---|
파이썬에서 파일의 MD5 체크섬을 어떻게 계산합니까? (0) | 2023.07.16 |
Oracle에서 행을 열로 변환하는 방법 (0) | 2023.07.16 |
스프링 부트 JAR의 BOOT-INF 및 META-INF 디렉토리는 무엇입니까? (0) | 2023.07.06 |
시스템을 사용하여 메모리에 ZIP 아카이브 만들기IO.압축 (0) | 2023.07.06 |