首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >非规范化模型中的MongoDB查询

非规范化模型中的MongoDB查询
EN

Stack Overflow用户
提问于 2015-06-21 16:56:33
回答 1查看 61关注 0票数 0

我必须展示使用规范化模型的优势(在本例中),在MongoDB中有两个集合:第一个用于教练,第二个用于团队。所以,我用一个非正态化的模型来显示这些差异。例如,如果我想更新巴切洛纳的手掌(从23西甲到24西甲),用非正规化的模式,我必须找到所有教练巴切洛纳,然后我必须更新每个教练的手掌。显然太贵了。我想做这个例子。

我有一个他们所指导的足球教练和球队的非正规化模型。下面是一个示例:

代码语言:javascript
复制
     "_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
          }
  ]

正如你所看到的,关于球队的信息被写入教练文档中。现在,我想更新巴塞罗纳的掌纹。我尝试了这个查询,但是我得到了一个错误:

代码语言:javascript
复制
 db.coach.update({_id:"LEMG_1970"}, {$set:{"coached_Team.palmarès.La Liga":24}})

以下是建议:

代码语言:javascript
复制
"code" : 16837,
            "errmsg" : "cannot use the part (coached_Team of coached_Team.palmarès.La Liga) to traverse the element

我能做些什么来用非正规化模型来更新手掌呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-21 17:46:01

使用更新中的positional operator,这将标识要更新的数组中的元素,而无需显式指定元素在数组中的位置。由于位置$运算符充当与查询文档匹配的第一个元素的占位符,因此数组字段必须显示为查询文档的一部分,因此在查询中需要coached_Team数组字段:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30967050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档