【问题标题】:Two queries on different collections - MongoDB关于不同集合的两个查询 - MongoDB
【发布时间】:2015-06-04 11:10:33
【问题描述】:

我在 MongoDB 中有两个集合。第一个包含一些足球教练的信息,第二个包含有关球队的数据。 比如这是一个coach collection的文档:

 {
         "_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"
   }

好吧,我知道 mongo 不支持集合之间的连接。 现在假设我将关于团队集合的查询返回保存在一个名为 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 不起作用。

【问题讨论】:

  • 您是否尝试过不使用" 引号包围x[0]._id 的查询,因为这会将其编码为字符串并且不会查找变量的内容。

标签: mongodb mongodb-query


【解决方案1】:

其实这有点简单:

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 */ } } })

【讨论】:

    【解决方案2】:

    您需要删除变量x[0]._id 周围的引号"。否则会被编码为String,变量的内容将不会被查找和填充。

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

    【讨论】:

      【解决方案3】:

      首先你找到所有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"}) 
      

      【讨论】:

        猜你喜欢
        • 2016-09-27
        • 2012-05-11
        • 1970-01-01
        • 1970-01-01
        • 2020-03-24
        • 2016-12-13
        • 1970-01-01
        • 1970-01-01
        • 2023-03-28
        相关资源
        最近更新 更多