2个集合之间的mongoDB连接

2个集合之间的mongoDB连接,mongodb,join,aggregation-framework,Mongodb,Join,Aggregation Framework,我正试着加入两人的行列。 首先是电影列表: [ { “_id”:“电影:1”, “演员”:[ { “_id”:“艺术家:15”, “角色”:“约翰·弗格森” }, { “_id”:“艺术家:16”, “角色”:“马德琳·埃尔斯特” }, { “_id”:“艺术家:282”, “角色”:空 } ], “国家”:“德”, “董事”:{ _id:“艺术家:3” }, “流派”:“戏剧”, “概述”:“Scottie Ferguson,古代警察督察,他是一名警察局局长,他是一名警官。Elster,儿子a

我正试着加入两人的行列。 首先是电影列表:

[
{
“_id”:“电影:1”,
“演员”:[
{
“_id”:“艺术家:15”,
“角色”:“约翰·弗格森”
},
{
“_id”:“艺术家:16”,
“角色”:“马德琳·埃尔斯特”
},
{
“_id”:“艺术家:282”,
“角色”:空
}
],
“国家”:“德”,
“董事”:{
_id:“艺术家:3”
},
“流派”:“戏剧”,
“概述”:“Scottie Ferguson,古代警察督察,他是一名警察局局长,他是一名警官。Elster,儿子ami,女检察官,马德琳,自杀倾向者。苏格兰女性的爱情是一种对女性的尊重,因为她是一名受害者……”,
“标题”:“眩晕”,
“年份”:1958年
},
{
“_id”:“电影:2”,
“演员”:[
{
“_id”:“艺术家:5”,
“角色”:“里普利”
}
],
“国家”:“美国”,
“董事”:{
_id:“艺术家:4”
},
“类型”:“科幻小说”,
“概述”:“交通运输使团属地空间规划”是指“交通运输使团”所在地的空间规划。该地位于维也纳,是一个愚昧无知的地方,
“头衔”:“外国人”,
“年份”:1979年
},
{
“_id”:“电影:5”,
“演员”:[
{
“_id”:“艺术家:11”,
“角色”:“肖恩·阿彻/卡斯特·特洛伊”
},
{
“_id”:“艺术家:12”,
“角色”:“卡斯特·特洛伊/肖恩·阿彻”
}
],
“国家”:“美国”,
“董事”:{
_id:“艺术家:10”
},
“类型”:“动作”,
“摘要”:"反恐部门主管肖恩·阿彻·雷切切·卡斯特·特洛伊,负责六名恐怖分子的死亡以及与特洛伊议会的谈判。这是对洛杉矶国会大厦的一次轰炸罗伊,
“标题”:“转/面”,
“年份”:1997年
},
{
“_id”:“电影:4”,
“演员”:[…],
“国家”:“FR”,
“董事”:{
_id:“艺术家:9”
},
“流派”:“戏剧”,
“摘要”:空,
“头衔”:“牺牲”,
“年份”:1986年
},
{
“_id”:“电影:3”,
“演员”:[
{
“_id”:“艺术家:109”,
“角色”:“Rose DeWitt Bukater”
},
{
“_id”:“艺术家:110”,
“角色”:“杰克·道森”
}
],
“国家”:“美国”,
“董事”:{
_id:“艺术家:6”
},
“流派”:“戏剧”,
“摘要”:Tebe Bar BrCK洛维特,UNE EXCEL EL ReaPaVE TI TeaMic ReMunt La Surle LoCuli Dune FunMe胡。",
“标题”:“泰坦尼克号”,
“年份”:1997年
},
{
“_id”:“电影:19”,
“演员”:[
{
“_id”:“艺术家:44”,
“角色”:“终结者”
}
],
“国家”:“美国”,
“董事”:{
_id:“艺术家:6”
},
“类型”:“科幻小说”,
“总结”:“迪克斯生物场馆Dufut-DeBurQu.Sur.TeRe,L'une D'Enter ELES,LE终结者,doIT消除une CeTaTin Sarah Connor,Qui-doIT EnFutter Celui-Qi Serle Dun'Gunpe de Currist. L'AutRe,Kyle Reese,EST PARS Reeleles de DeNdRe莎拉……”
“标题”:“终结者”,
“年份”:1984年
},
…
第二组由每位艺术家(艺术家可以是艺术家和/或电影导演)创作:

[
{
“_id”:“艺术家:1”,
“出生日期”:“1971年”,
“名字”:“索菲亚”,
“姓”:“科波拉”
},
{
“_id”:“艺术家:2”,
“出生日期”:空,
“名字”:“Kirsten”,
“姓”:“邓斯特”
},
{
“_id”:“艺术家:3”,
“出生日期”:“1899年”,
“名字”:“阿尔弗雷德”,
“姓”:“希区柯克”
},
{
“_id”:“艺术家:4”,
“出生日期”:“1937年”,
“名字”:“里德利”,
“姓”:“斯科特”
},
{
“_id”:“艺术家:5”,
“出生日期”:“1949年”,
“名字”:“Sigourney”,
“姓”:“织工”
},
{
“_id”:“艺术家:6”,
“出生日期”:“1954年”,
“名字”:“詹姆斯”,
“姓”:“卡梅隆”
},
{
“_id”:“艺术家:7”,
“出生日期”:“1973年”,
“名字”:“理查德”,
“姓”:“弗莱舍”
},
{
“_id”:“艺术家:8”,
“出生日期”:“1923年”,
“名字”:“查尔顿”,
“姓”:“赫斯通”
},
{
“_id”:“艺术家:9”,
“出生日期”:“1932年”,
“名字”:“安德烈”,
“姓”:“塔尔科夫斯基”
},
我想知道每位导演的电影,大概是这样的:

[{"first_name": "James", "last_name": "Cameron", "films": ["Titanic", "Terminator"]},
 …
]
我提出以下要求:

db.artists.aggregate([
{$lookup:{from:“连接”,
localField:“艺术家。\u id”,
外域:“电影。导演”,
as:“电影”}
},
{$project:{“\u id”:0,
“名字”:1,
“姓氏”:1,
“电影名称”:1}
}
]);
结果不正确(我有导演拍摄的所有电影,而不仅仅是导演拍摄的电影):

{
“电影”:[
{
“头衔”:“牺牲”
},
{
“头衔”:“外国人”
},
{
“标题”:“泰坦尼克号”
},
{
“标题”:“转/面”
},
{
“标题”:“美国美人”
},
{
“标题”:“昏睡谷”
},
{
“标题”:“眩晕”
},
{
“标题”:“基督教堂”
},
{
“标题”:“重要的”
},
{
“标题”:“58分钟万岁”
},
{
“标题”:“梵高”
},
{
“标题”:“七”
},
… 
],
“名字”:“詹姆斯”,
“洛杉矶
var mapJoin = function() {
if (this._id.indexOf("artist") != -1) {
 this.type="artist";
 emit(this._id, this);
}
else {
 this.type="film";
 delete this.summary;
 delete this.actors;
 emit(this.director._id, this);
}
}

var reduceJoin = function(id, items) {
var director = null, films={result: []}
for (var idx = 0; idx < items.length; idx++) {
 if (items[idx].type=="artist") {
 director = items[idx];
 }
}
for (var idx = 0; idx < items.length; idx++) {
 if (items[idx].type=="film" && director != null) {
 items[idx].director = director;
 films.result.push (items[idx]);
 }
}
return films;
};

db.jointure.mapReduce(mapJoin, reduceJoin, {out: {"inline": 1}});
db.artists.aggregate([
  {$lookup: {
      from: "movies",
      localField: "_id",
      foreignField: "director._id",
      as: "films"
  }},
  {$project: {
      "_id": 0,
      "first_name": 1,
      "last_name": 1,
      "films.title": 1
  }}
])
  {$match: {
      $expr: {
        $gt: [
          {$size: "$films"},
          0
        ]
      }
  }}