对不同 collections - MongoDB 的两个查询
Two queries on different collections - MongoDB
我在 MongoDB 中有两个 collection。第一个包含一些足球教练的信息,第二个包含有关球队的数据。
比如这是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
}
这是collection团队的文档:
{
"_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 不支持 collection 之间的连接。
现在假设我将团队 collection 的查询的 return 保存在一个名为 x 的数组中。
例如:
var x = db.team.find({_id:"Bar.43"}).toArray()
现在我想使用这个数组 x 来查询教练 collection 并找到执教过具有该 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}})
P.S。我在论坛里找了类似的问题,答案没有回复我。
This,例如,不起作用。
其实更简单一点:
var x = db.team.find({_id:"Bar.43"}).toArray();
var coaches = db.coach.find( { "coached_Team.team_id" : x[0]._id } );
一种稍微简洁的方法(即 ) is using $elemMatch
:
var coaches = db.coach.find({ 'coached_Team' : {
'$elemMatch' : { 'team_id': x[0]._id /*, optionally more criteria */ } } })
您需要删除变量 x[0]._id
周围的引号 "
。否则这将被编码为一个字符串,变量的内容将不会被查找和填充。
var x = db.team.find({_id:"Bar.43"}).toArray();
db.coach.find({"coached_Team.team_id":x[0]._id});
首先你找到所有 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 更改为 distinct as :
var teamId = db.team.distinct("_id",{"_id":"Bar.43"})
我在 MongoDB 中有两个 collection。第一个包含一些足球教练的信息,第二个包含有关球队的数据。 比如这是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
}
这是collection团队的文档:
{
"_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 不支持 collection 之间的连接。 现在假设我将团队 collection 的查询的 return 保存在一个名为 x 的数组中。 例如:
var x = db.team.find({_id:"Bar.43"}).toArray()
现在我想使用这个数组 x 来查询教练 collection 并找到执教过具有该 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}})
P.S。我在论坛里找了类似的问题,答案没有回复我。
This,例如,不起作用。
其实更简单一点:
var x = db.team.find({_id:"Bar.43"}).toArray();
var coaches = db.coach.find( { "coached_Team.team_id" : x[0]._id } );
一种稍微简洁的方法(即 $elemMatch
:
var coaches = db.coach.find({ 'coached_Team' : {
'$elemMatch' : { 'team_id': x[0]._id /*, optionally more criteria */ } } })
您需要删除变量 x[0]._id
周围的引号 "
。否则这将被编码为一个字符串,变量的内容将不会被查找和填充。
var x = db.team.find({_id:"Bar.43"}).toArray();
db.coach.find({"coached_Team.team_id":x[0]._id});
首先你找到所有 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 更改为 distinct as :
var teamId = db.team.distinct("_id",{"_id":"Bar.43"})