2015-06-04 40 views
3

我在MongoDB中有两个集合。第一个包含关于一些足球教练的信息,第二个包含关于球队的数据。 例如,这是教练收集的文件:关于不同集合的两个查询 - MongoDB

{ 
     "_id" : ObjectId("556caaac9262ab4f14165fca"), 
     "name" : "Luis", 
     "surname" : "Enrique Martinez Garcia", 
     "age" : 45, 
     "date_Of_birth" : { 
       "day" : 8, 
       "month" : 5, 
       "year" : 1970 
     }, 
     "place_Of_birth" : "Gijòn", 
     "nationality" : "Spanish", 
     "preferred_formation" : "4-3-3 off", 
     "coached_Team" : [ 
       { 
         "team_id" : "Bar.43", 
         "in_charge" : { 
           "from" : "01/july/2014" 
         }, 
         "matches" : 59 
       }, 
       { 
         "team_id" : "Cel.00", 
         "in_charge" : { 
           "from" : "9/june/2013", 
           "to" : "30/june/2014" 
         }, 
         "matches" : 40 
       }, 
       { 
         "team_id" : "Rom.01", 
         "in_charge" : { 
           "from" : "7/june/2011", 
           "to" : "10/may/2012" 
         }, 
         "matches" : 41 
       } 

这里是团队收集的文件:

{ 
      "_id" : "Bar.43", 
      "official_name" : "Futbol Club Barcelona", 
      "country" : "Spain", 
      "started_by" : { 
        "day" : 28, 
        "month" : 11, 
        "year" : 1899 
      }, 
      "stadium" : { 
        "name" : "Camp Nou", 
        "capacity" : 99354 
      }, 
      "palmarès" : { 
        "La Liga" : 23, 
        "Copa del Rey" : 27, 
        "Supercopa de Espana" : 11, 
        "UEFA Champions League" : 4, 
        "UEFA Cup Winners Cup" : 4, 
        "UEFA Super Cup" : 4, 
        "FIFA Club World cup" : 2 
      }, 
      "uniform" : "blue and dark red" 
    } 

嗯,我知道蒙戈不支持集合之间的连接。 现在假设我在一个名为x的数组中保存了对团队集合的查询返回。 例如:

var x = db.team.find({_id:"Bar.43"}).toArray() 

现在我想用这个数组x查询主教练收集和发现,执教的球队与教练的ID。 我想在某些方面,但他们不工作:

[1] 

db.coach.aggregate([{$unwind:"$coached_Team"},{$match:{"coached_Team.team_id:"x[0]._id"}}]) 

[2] 
db.team.find({"x[0]._id":{$in:coached_Team}}) 

附:我在论坛上寻找类似的问题,答案不答复我的。例如,
This不起作用。

+0

你没有试过你的查询吗?引用'x [0] ._ id'的引号,因为它将它编码为一个字符串,并且不会查找变量的内容。 – Simulant

回答

1

您需要删除您的变量x[0]._id各地报价"。否则,此编码为一个字符串和变量的内容不会抬头,填写。

var x = db.team.find({_id:"Bar.43"}).toArray(); 
db.coach.find({"coached_Team.team_id":x[0]._id}); 
2

,实际上是一个有点简单:

var x = db.team.find({_id:"Bar.43"}).toArray(); 

var coaches = db.coach.find({ "coached_Team.team_id" : x[0]._id }); 

一个稍微更简洁的方法(即required when you want multiple criteria)使用$elemMatch

var coaches = db.coach.find({ 'coached_Team' : { 
       '$elemMatch' : { 'team_id': x[0]._id /*, optionally more criteria */ } } }) 
0

首先你会发现所有的distinct队id作为

var teamId = db.team.distinct("_id") 

teamId包含团队的ID阵列。一个使用这种聚合的教练收集

db.coach.aggregate({"$unwind":"$coached_Team"},{"$match":{"coached_Team.team_id":{"$in":teamId}}}).pretty() 

没有聚集利用这个

db.coach.find({"coached_Team":{"$elemMatch":{"team_id":{"$in":teamId}}}},{"coached_Team.$.team_id":1}) 

或者

db.coach.find({"coached_Team.team_id":{"$in":teamId}},{"coached_Team.$.team_id":1}) 

,或者如果你想只有特定团队ID更改上述不同的是:

var teamId = db.team.distinct("_id",{"_id":"Bar.43"})