$196 결과의 $일치
다음 몽고 코드가 있습니다.
db.users.aggregate([
{
$match: {
$and: [
{ UserName: { $eq: 'administrator' } },
{ 'Company.CompanyName': { $eq: 'test' } }
]
}
},
{
$lookup: {
from: "companies",
localField: "CompanyID",
foreignField: "CompanyID",
as: "Company"
}
},
])
그$lookup
코드의 일부가 잘 작동합니다.다음 결과가 나왔습니다.
하지만 제가 덧붙이자면$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
조회할 항목
Companies
에Users
일치하여CompanyID
여기서 추가:- 각 사용자는 조건과 일치해야 합니다.
User.UserName
동등한administrator
- 각각
Company
에User
조건과 일치해야 합니다.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
.
여기 룩업 내부 배열을 피터링하기 위한 코드가 있습니다.
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
'sourcetip' 카테고리의 다른 글
이미 갈라진 헝크를 깃으로 나눌 수 있습니까? (0) | 2023.06.27 |
---|---|
Firebase 연결을 명확히 합니다. (0) | 2023.06.27 |
하위구 축 범위 설정 방법 (0) | 2023.06.27 |
ModuleNotFoundError: 'sklearn'이라는 이름의 모듈이 없습니다. (0) | 2023.06.27 |
PHP에서 mysql 데이터베이스로 Excel 파일을 가져오는 방법 (0) | 2023.06.22 |