2015-06-21 51 views
0

我必须展示使用规范化模型(在这种情况下)的优势,MongoDB中有两个集合:第一个用于教练,第二个用于团队。 因此,我使用非规范化模型来显示差异。 例如,如果我想更新Barcellona的手掌(从23个西甲到24个西甲),并且使用非规范化模型,我必须找到所有执教Barcellona的教练,然后我必须更新每个教练内的手掌。显然它太昂贵了。我想要做这个例子。MongoDB - 非规范化模型中的查询

我有足球教练和他们执教过的球队的非规范化模型。 下面是一个例子:

 "_id" : "LEMG_1970", 
    "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" : [ 
      { 


"_id" : "Bar.43", 
    "official_name" : "Futbol Club Barcelona" 
    "common_name" : "Barcellona", 
    "country" : "Spain", 
    "started_by" : { 
      "day" : 28, 
      "month" : 11, 
      "year" : 1899 
    }, 
    "championship" : "La Liga", 
    "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 
    }, 
    "average age" : 26.9, 
    "squad value(in mln)" : 591.5, 
    "foreigners" : 13, 
    "uniform" : [ 
      "blue", 
      "dark red" 
    ], 
        "in_charge" : { 
          "from" : { 
            "day" : 1, 
            "month" : 7, 
            "year" : 2014 
          } 
        }, 
        "matches" : 59 
      }, 
      { 

      { 
     "_id" : "Rom.01", 
    "official_name" : "Associazione Sportiva Roma SpA", 
    "common_name" : "Roma", 
    "country" : "Italy", 
    "started_by" : { 
      "day" : 22, 
      "month" : 6, 
      "year" : 1927 
    }, 
    "championship" : "Serie A", 
    "stadium" : { 
      "name" : "Olimpico di Roma", 
      "capacity" : 73261 
    }, 
    "palmarès" : { 
      "Serie A" : 3, 
      "Coppa Italia" : 9, 
      "Supercoppa Italiana" : 2, 
      "Serie B" : 1 
    }, 
    "average age" : 28.3, 
    "squad value(in mln)" : 253.7, 
    "foreigners" : 22, 
    "uniform" : [ 
      "red", 
      "yellow" 
    ], 
        "in_charge" : { 
          "from" : { 
            "day" : 7, 
            "month" : 6, 
            "year" : 2011 
          }, 
          "to" : { 
            "day" : 10, 
            "month" : 5, 
            "year" : 2012 
          } 
        }, 
        "matches" : 41 
      } 
    ] 

正如你可以看到关于球队的信息是到教练的文档。现在,我想更新Barcellona的手掌。我想这个查询,但我得到了一个错误:

db.coach.update({_id:"LEMG_1970"}, {$set:{"coached_Team.palmarès.La Liga":24}}) 

这是忠告:

"code" : 16837, 
      "errmsg" : "cannot use the part (coached_Team of coached_Team.palmarès.La Liga) to traverse the element 

我能做些什么来更新与非规格化模式帕尔马里斯?

回答

1

在更新中使用$ positional operator这标识了数组中要更新的元素,而不显式指定数组中元素的位置。由于位置$运营商充当了查询文档相匹配的第一个元素的占位符,该数组字段必须出现在查询文档的一部分,因此,您需要在您的查询coached_Team阵列领域:

var query = { 
     "_id" : "LEMG_1970", 
     "coached_Team._id" : "Bar.43" 
    }, 
    update = { 
     "$set": { 
      "coached_Team.$.palmarès.La Liga": 24 
     } 
    }; 

db.coach.update(query, update); 
+1

非常好,很棒的提示。 – DistribuzioneGaussiana