次のmongoコードがあります:
db.users.aggregate([
{
$match: {
$and: [
{ UserName: { $eq: 'administrator' } },
{ 'Company.CompanyName': { $eq: 'test' } }
]
}
},
{
$lookup: {
from: "companies",
localField: "CompanyID",
foreignField: "CompanyID",
as: "Company"
}
},
])
$lookup
すばらしいコードの一部。私は次の結果を得ました:
しかし、$match
コードに、何ももたらしません。
問題は2番目の一致にあることがわかりました:{ 'Company.CompanyName': { $eq: 'test' } }
、しかし、私はそれが何が悪いのか理解できません。何か案は?
UPDATE:
私も試しました$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では、$addFields
パイプラインと$filter
演算子は、指定された条件に一致する要素を持つCompany
配列のみを返します。その後、$filter
$arrayElemAt
本質的に$unwind
配列を平坦化する機能。
上記の概念を理解するには、この例に従ってください。
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
で以前に定義された変数を再利用できます。