我有一个名为season的系列,如下所示:
[
{
week: 1,
matchups: [
{
home : ObjectId("1"),
away : ObjectId("2")
},
{
home : ObjectId("3"),
away : ObjectId("4")
},
],
_id: 50fc50c9ce87149ee3000007
},
{
week: 2,
matchups: [
{
home : ObjectId("3"),
away : ObjectId("1")
},
{
home : ObjectId("2"),
away : ObjectId("4")
},
],
_id: 50fc50c9ce87149ee3000008
}
]
我试图获得主场或客场球队为ObjectId(" 1")的所有比赛。我希望回报看起来像这样:
[
{
week: 1,
matchups: [
{
home : ObjectId("1"),
away : ObjectId("2")
}
],
_id: 50fc50c9ce87149ee3000007
},
{
week: 2,
matchups: [
{
home : ObjectId("3"),
away : ObjectId("1")
}
],
_id: 50fc50c9ce87149ee3000008
}
]
是否可以在db.season.find()?
上使用此结果答案 0 :(得分:2)
只要您最多可以匹配一个潜在的matchups
元素,就可以使用$elemMatch
投影运算符来执行此操作:
db.seasons.find(
{$or: [{'matchups.home': ObjectId("1")},{'matchups.away': ObjectId("1")}]},
{week: 1, matchups: {
$elemMatch: {$or: [{home: ObjectId("1")},{away: ObjectId("1")}]}
}});
与Wes关于ObjectId("1")
无效的相同警告。
答案 1 :(得分:1)
不是.find,而是.aggregate:
db.seasons.aggregate(
{$match:{$or:[{"matchups.home":ObjectId("1")}, {"matchups.away":ObjectId("1")}]}},
{$unwind:"$matchups"},
{$match:{$or:[{"matchups.home":ObjectId("1")}, {"matchups.away":ObjectId("1")}]}},
{$group:{_id:"$_id", week:{$first:"$week"}, matchups:{$addToSet:"$matchups"}}});
限制是带有聚合的文档大小。希望这会有所帮助。
你可以做的最好.find是第一场比赛,然后过滤应用程序方面的比赛,AFAIK。
此外,ObjectId(“1”)无效,仅供参考。