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()
,因为基本投影不可能在选择顶级元素之外进行操作。最有效的方法可能很难理解。如果所有这些都是从文档中过滤内容的话,那么您最好只过滤掉代码中的内容,并将修改后的结果发布为另一个集合。是的,我决定将数据分散到多个集合中,谢谢!