我正在嘗試從不在其他集合中的集合中獲取檔案(SQL 中常見的 NOT IN 子句)。
如果我運行下一個查詢:
db.Companies_Movies.aggregate([
{
$project:
{
"CompanyList.Movies.Code" : 1
}
},
{
$match:
{
"CompanyList.CodeCompany": "23"
}
},
{
$lookup:
{
from: "Movies",
localField: "CompanyList.Movies.Code",
foreignField: "Movie.Code",
as: "matched_docs"
}
}
]);
此查詢顯示 CompanyList.Movies.Code 和 Movie.Code 中包含的電影。好的。但我只是將其余電影包含在 CompanyList.Movies 中,其代碼未包含在 Movie.Code 中。
正如 Nikos Tsagkas 在MongoDB shell 查詢中的 Get "data from collection b not in collection a" 中所說,包含以下句子就足夠了:
{
$match: { "matched_docs": { $eq: [] } }
}
但是當我運行我的最終代碼時,它不會回傳任何內容:
db.Companies_Movies.aggregate([
{
$project:
{
"CompanyList.Movies.Code" : 1
}
},
{
$match:
{
"CompanyList.CodeCompany": "23"
}
},
{
$lookup:
{
from: "Movies",
localField: "CompanyList.Movies.Code",
foreignField: "Movie.Code",
as: "matched_docs"
}
},
{
$match: { "matched_docs": { $eq: [] } }
}
]);
此代碼未回傳 59 個檔案。
有誰知道可能會發生什么?
謝謝大家。
uj5u.com熱心網友回復:
這只是由您的$project階段引起的,在您運行后:
{
$project: {
"CompanyList.Movies.Code" : 1
}
},
您的資料將如下所示:
{
CompanyList: [
{
Movies: { code: "123", ... other fields }
}
]
}
現在您正在嘗試匹配"CompanyList.CodeCompany": "23",但該欄位CodeCompany根本不存在,因為您沒有在專案階段提供它。
因此,只需更改您的投影階段以包含您將在稍后階段使用的欄位:
{
$project: {
"CompanyList.Movies.Code" : 1,
"CompanyList.CodeCompany": 1
}
},
uj5u.com熱心網友回復:
湯姆。謝謝你的幫助。
您的解決方案不起作用。
這是我在更改后在 MongoDB Compass 中創建的管道:
[{
$match:
{
'CompanyList.CodeCompany': '23'
}
},
{
$lookup:
{
from: 'Movies',
localField: 'CompanyList.Movies.Code',
foreignField: 'Movie.Code',
as: 'docs'
}
},
{
$project:
{
'CompanyList.Movies.Code': 1,
'CompanyList.CodeCompany': 1
}
},
{
$match:
{
docs:{ $eq: [] }
}
}]
如果我洗掉 $project,它也不起作用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/413806.html
標籤:
