Mongodb 仅从Mongo中的嵌套数组返回内部元素
我目前有一个集合,其中包含这样的文档Mongodb 仅从Mongo中的嵌套数组返回内部元素,mongodb,meteor,Mongodb,Meteor,我目前有一个集合,其中包含这样的文档 { "_id" : "sHXFGyTkZBYeZXcax", "name" : "Sunless Sunday", "description" : "blabla", "game_id" : "qPrZBahQLHQXabwuv", "date_checkin" : ISODate("2015-11-07T01:01:00.000Z"), "date_start" : ISODate("2015-11-12T0
{
"_id" : "sHXFGyTkZBYeZXcax",
"name" : "Sunless Sunday",
"description" : "blabla",
"game_id" : "qPrZBahQLHQXabwuv",
"date_checkin" : ISODate("2015-11-07T01:01:00.000Z"),
"date_start" : ISODate("2015-11-12T00:04:00.000Z"),
"date_end" : ISODate("2015-11-19T00:05:00.000Z"),
"company_id" : 1,
"featured" : 1,
"premium" : 0,
"type" : 0,
"ongoing" : 1,
"prizes" : [
{
"place" : 1,
"amount" : 18
},
{
"place" : 2,
"amount" : 2
}
],
"createdAt" : ISODate("2015-11-05T22:34:01.494Z"),
"modifiedAt" : ISODate("2015-11-05T22:34:01.494Z"),
"owner" : "CLEopD9HRAeE9eiXW",
"players" : [
{
"player_id" : "WdLK9aaRgdPnYsw8B",
"status" : 2
},
{
"player_id" : "vF6JEwMy9yaRtKuiG",
"status" : 1
},
{
"player_id" : "KD4s2E3AezhFcQDCd",
"status" : -1
},
{
"player_id" : "KD4s2E3AezhFcQDCd",
"status" : -1
},
{
"player_id" : "KD4s2E3AezhFcQDCd",
"status" : -1
},
{
"player_id" : "KD4s2E3AezhFcQDCd",
"status" : -1
},
{
"player_id" : "KD4s2E3AezhFcQDCd",
"status" : -1
},
{
"player_id" : "KD4s2E3AezhFcQDCd",
"status" : -1
},
{
"player_id" : "KD4s2E3AezhFcQDCd",
"status" : -1
},
{
"player_id" : "KD4s2E3AezhFcQDCd",
"status" : 1
}
],
"rounds" : [
{
"roundNumber" : 1,
"participants" : [],
"matchesToWin" : 3,
"matches" : [
{
"matchNumber" : 1,
"party1" : "WdLK9aaRgdPnYsw8B"
}
]
},
{
"roundNumber" : 2,
"participants" : [
{
"player_id" : "WdLK9aaRgdPnYsw8B",
"status" : 2
},
{
"player_id" : "vF6JEwMy9yaRtKuiG",
"status" : 1
},
{
"player_id" : "KD4s2E3AezhFcQDCd",
"status" : 1
}
],
"matchesToWin" : 2,
"matches" : [
{
"matchNumber" : 1,
"players" : [
{
"party" : 1
},
{
"player_id" : "WdLK9aaRgdPnYsw8B",
"party" : 2
}
],
"party1" : "freewin",
"party2" : "WdLK9aaRgdPnYsw8B",
"currentGame" : 1,
"winner" : "WdLK9aaRgdPnYsw8B",
"matchFinished" : ISODate("2015-11-16T16:25:37.712Z")
},
{
"matchNumber" : 2,
"players" : [
{
"player_id" : "vF6JEwMy9yaRtKuiG",
"party" : 1
},
{
"player_id" : "KD4s2E3AezhFcQDCd",
"party" : 2
}
],
"party1" : "vF6JEwMy9yaRtKuiG",
"party2" : "KD4s2E3AezhFcQDCd",
"score1" : 0,
"score2" : 0,
"currentGame" : 1
}
]
}
]
}
现在我试着看看某个球员是否有一场活跃的比赛。因此,这意味着,在一场目前没有赢家的比赛中,玩家可能是第1方或第2方
我目前有这个问题
activeMatch = Tournaments.find({
'ongoing': 1,
'rounds.matches': {
$elemMatch: {
$or: [
{ 'party1': player[0]._id },
{ 'party2': player[0]._id },
],
winner: { $exists: false }
}
}
},
{ "rounds.matches.$": 1 }
);
目前我有两个问题:
- 我的查询返回匹配的轮数,但不过滤匹配的轮数。所以我实际上只会在roundNumber=2的情况下得到一轮,但从那轮中我会得到每一场比赛,因为我只对一场特定的比赛感兴趣
- 过滤只在通过shell执行查询时发生。当我在.jsx文件和console.log中将结果记录到客户端时,我看到了所有轮次
有什么帮助吗?如果您想让服务器进行过滤,那么您需要
.aggregate()
,因为基本投影不可能在选择顶级元素之外进行操作。最有效的方法可能很难理解。如果所有这些都是从文档中过滤内容的话,那么您最好只过滤掉代码中的内容,并将修改后的结果发布为另一个集合。是的,我决定将数据分散到多个集合中,谢谢!如果希望服务器进行筛选,则需要使用.aggregate()
,因为基本投影不可能在选择顶级元素之外进行操作。最有效的方法可能很难理解。如果所有这些都是从文档中过滤内容的话,那么您最好只过滤掉代码中的内容,并将修改后的结果发布为另一个集合。是的,我决定将数据分散到多个集合中,谢谢!