$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
'programing' 카테고리의 다른 글
| mongodb 없이 _id 문자열과 같은 mongodb를 만들 수 있는 방법이 있습니까? (0) | 2023.05.24 |
|---|---|
| 스위프트 레퍼런스의 _ 밑줄 대표자는 무엇입니까? (0) | 2023.05.24 |
| vba 코드 리팩터링 - 도움이 되는 도구가 있습니까? (0) | 2023.05.24 |
| 터미널에서 내 Git 사용자 이름을 변경하려면 어떻게 해야 합니까? (0) | 2023.05.14 |
| Express.js: 원격 클라이언트 주소를 가져오는 방법 (0) | 2023.05.14 |