我必须展示使用规范化模型的优势(在本例中),在MongoDB中有两个集合:第一个用于教练,第二个用于团队。所以,我用一个非正态化的模型来显示这些差异。例如,如果我想更新巴切洛纳的手掌(从23西甲到24西甲),用非正规化的模式,我必须找到所有教练巴切洛纳,然后我必须更新每个教练的手掌。显然太贵了。我想做这个例子。
我有一个他们所指导的足球教练和球队的非正规化模型。下面是一个示例:
"_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
}
]正如你所看到的,关于球队的信息被写入教练文档中。现在,我想更新巴塞罗纳的掌纹。我尝试了这个查询,但是我得到了一个错误:
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我能做些什么来用非正规化模型来更新手掌呢?
发布于 2015-06-21 17:46:01
使用更新中的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); https://stackoverflow.com/questions/30967050
复制相似问题