MongoDB 从 collection 获取文档,而不是从其他 collection
MongoDB get documents from a collection not in other collection
我正在尝试从 collection 中获取文档,而其他 collection 中不存在(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 在 Get "data from collection b not in collection a" in a MongoDB shell query 中所说,包含以下句子就足够了:
{
$match: { "matched_docs": { $eq: [] } }
}
但是当我 运行 我的最终代码时,它没有 returns 任何东西:
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 个。
这是我在 Tom 的更改后在 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,它也不起作用。
样本数据(减少)
Companies_Movies collection:
{
_id:ObjectId("61bf47b974641866e1244e65"),
"CompanyList": {
"CodeCompany": "23",
"NameCompany": "Company Name Entertainment",
"Movies": [{
"Code": "123",
"Name": "Title 1",
"Order": 1,
"UserDescription": null
}, {
"Code": "124",
"Name": "Title 2",
"Order": 2,
"UserDescription": null
}, {
"Code": "125",
"Name": "Title 3",
"Order": 3,
"UserDescription": null
}],
"DateInserted": {
"$date": "2021-12-13T17:30:06.824Z"
}
}
}
电影 collection:
[{
_id:ObjectId("61bf57bc9d1f93b7ae5fa785"),
"Movie": {
"Code": "123",
"OriginalTitle": "Title 1",
"Year": 2021
},
_id:ObjectId("61bf57bc9d1f93b7ae5fa786"),
"Movie": {
"Code": "124",
"OriginalTitle": "Title 2",
"Year": 2021
},
_id:ObjectId("61bf57bc9d1f93b7ae5fa787"),
"Movie": {
"Code": "125",
"OriginalTitle": "Title 3",
"Year": 2021
},
_id:ObjectId("61bf57bc9d1f93b7ae5fa788"),
"Movie": {
"Code": "126",
"OriginalTitle": "Title 4",
"Year": 2021
}
}]
有人知道会发生什么吗?
感谢大家。
这只是你的$project
阶段造成的,在你运行:
之后
{
$project: {
"CompanyList.Movies.Code" : 1
}
},
您的数据将如下所示:
{
CompanyList: [
{
Movies: { code: "123", ... other fields }
}
]
}
现在您正在尝试匹配 "CompanyList.CodeCompany": "23"
,但是字段 CodeCompany
根本不存在,因为您在项目阶段没有提供它。
所以只需更改您的投影阶段以包含您将在以后阶段使用的字段:
{
$project: {
"CompanyList.Movies.Code" : 1,
"CompanyList.CodeCompany": 1
}
},
我正在尝试从 collection 中获取文档,而其他 collection 中不存在(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 在 Get "data from collection b not in collection a" in a MongoDB shell query 中所说,包含以下句子就足够了:
{
$match: { "matched_docs": { $eq: [] } }
}
但是当我 运行 我的最终代码时,它没有 returns 任何东西:
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 个。
这是我在 Tom 的更改后在 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,它也不起作用。
样本数据(减少)
Companies_Movies collection:
{
_id:ObjectId("61bf47b974641866e1244e65"),
"CompanyList": {
"CodeCompany": "23",
"NameCompany": "Company Name Entertainment",
"Movies": [{
"Code": "123",
"Name": "Title 1",
"Order": 1,
"UserDescription": null
}, {
"Code": "124",
"Name": "Title 2",
"Order": 2,
"UserDescription": null
}, {
"Code": "125",
"Name": "Title 3",
"Order": 3,
"UserDescription": null
}],
"DateInserted": {
"$date": "2021-12-13T17:30:06.824Z"
}
}
}
电影 collection:
[{
_id:ObjectId("61bf57bc9d1f93b7ae5fa785"),
"Movie": {
"Code": "123",
"OriginalTitle": "Title 1",
"Year": 2021
},
_id:ObjectId("61bf57bc9d1f93b7ae5fa786"),
"Movie": {
"Code": "124",
"OriginalTitle": "Title 2",
"Year": 2021
},
_id:ObjectId("61bf57bc9d1f93b7ae5fa787"),
"Movie": {
"Code": "125",
"OriginalTitle": "Title 3",
"Year": 2021
},
_id:ObjectId("61bf57bc9d1f93b7ae5fa788"),
"Movie": {
"Code": "126",
"OriginalTitle": "Title 4",
"Year": 2021
}
}]
有人知道会发生什么吗?
感谢大家。
这只是你的$project
阶段造成的,在你运行:
{
$project: {
"CompanyList.Movies.Code" : 1
}
},
您的数据将如下所示:
{
CompanyList: [
{
Movies: { code: "123", ... other fields }
}
]
}
现在您正在尝试匹配 "CompanyList.CodeCompany": "23"
,但是字段 CodeCompany
根本不存在,因为您在项目阶段没有提供它。
所以只需更改您的投影阶段以包含您将在以后阶段使用的字段:
{
$project: {
"CompanyList.Movies.Code" : 1,
"CompanyList.CodeCompany": 1
}
},