2015-06-04 71 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"})