반응형
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
반응형
'sourcecode' 카테고리의 다른 글
특정 문자로 시작하는 항목을 쿼리하려면 어떻게 해야 합니까? (0) | 2023.03.20 |
---|---|
수집 개체가 PyMongo에서 호출할 수 없는 오류입니다. (0) | 2023.03.20 |
SQL Server SELECT to JSON 함수 (0) | 2023.03.20 |
게시 날짜를 저장하기 위해 두 열을 사용하여 Wordpress를 누르는 이유 (0) | 2023.03.20 |
반응 + 재료 UI - 경고: Prop className이 일치하지 않습니다. (0) | 2023.03.20 |