쿼리는 플레이어가 매치메이커를 사용할 때 가장 관련성이 높은 상대방을 찾고, 사용 가능한 대결을 나열할 때 가장 적합한 멀티플레이어 대결을 찾을 수 있는 강력한 도구입니다. 쿼리 표현식은 상대방 또는 사용 가능한 대결을 찾기 위한 사용자의 기준을 정의합니다. 이 쿼리는 결과를 제공하기 위해 쿼리 사용 후 Matchmaker properties 또는 대결 label을(를) 검사하는 큰 AND 명령으로 생각하십시오.
대결 label 쿼리는 레이블이 JSON 값인 경우에만 가능합니다.
쿼리는 구문 field:value을(를) 사용하는 하나 이상의 쿼리 용어로 구성됩니다. 쿼리에는 다수의 용어가 포함될 수 있으며 각 용어는 공백으로 구분됩니다(예: field:value field1:value1).
모든 값 유형에 동일한 구문을 사용할 수 있습니다. 예:
스트링: region:europe
숫자: level:10
숫자 범위: rank:<=5
날짜 범위: created:>"2021-12-25"
쿼리 용어 작성에 대한 자세한 내용은 아래 연산자 섹션을 참조하고 개별 쿼리 용어에 부여된 가중치를 기반으로 결과를 정렬하는 방법에 대한 자세한 내용은 부스팅을 참조하세요.
쿼리 용어의 시작 부분에 +에 의해 표시되는 MUST 연산자는 지정된 값의 문자열 요구 사항을 적용합니다. 위와 동일한 예를 사용하지만 MUST 연산자(+region:europe)를 사용하면 유럽 지역의 상대방만 결과에 반환되고 사용 가능한 사람이 충분하지 않은 경우 결과가 반환되지 않음을 의미합니다.
숫자 범위는 >, >=, <, <= 연산자와 함께 쿼리 용어로 사용할 수 있습니다. 예를 들어 created:>"2022-01-01" 2022년 1월 1일 이후에 생성된 결과를 반환하기 위해 날짜가 따옴표로 묶여 있여 구별되는 날짜 범위에 이러한 동일한 연산자를 사용할 수 있습니다.
정확한 쿼리 결과를 얻으려면 다음 문자 집합을 이스케이프해야 합니다. +-=&|><!(){}[]^\"~*?:\\/
공백 문자가 포함되어 있음에 주의합니다. 예를 들어, “깃발 뺏기” 대결을 쿼리하려면 mode:Capture The Flag 대신 mode:Capture\ The\ Flag을 사용합니다. 후자의 쿼리는 여전히 유효할 수 있지만 “뺏기” mode과(와) 일치하고 어디에나 “깃발"이 포함된 대결을 검색하므로 잘못된 결과가 생성됩니다.
대결 label에 현재 대결에 있는 모든 플레이어의 사용자 ID가 있는 배열 players이(가) 포함된 경우 다음 쿼리를 사용하여 지정된 친구가 속한 대결을 찾을 수 있습니다:
Server
1
2
3
4
5
6
7
8
localnk=require("nakama")localquery="label.groups:<friend_user_id>"localmatches=nk.match_list(query)for_,matchinipairs(matches)donk.logger_info(string.format("Match id %s",match.match_id))end
Server
1
2
3
4
5
6
7
8
9
10
11
query:="+label.players:<friend_user_id>"matches,err:=nk.MatchList(ctx,query)iferr!=nil{logger.WithField("err",err).Error("Match listings error.")return}for_,match:=rangematches{logger.Info("Match id %s",match.MatchId)}
Server
1
2
3
4
5
6
7
8
functionfindFriendMatch(context: nkruntime.Context,logger: nkruntime.Logger,nk: nkruntime.Nakama){constquery="+label.players:<friend_user_id>";varmatches=nk.matchList(query);matches.forEach(function(match){logger.info("Match id '%s'",match.matchId);});}
대결 label에 사용자가 속한 모든 그룹의 ID가 있는 배열 groups이(가) 포함된 경우 다음 쿼리를 사용하여 해당 그룹에서만 대결을 찾을 수 있습니다:
Server
1
2
3
4
5
6
7
8
localnk=require("nakama")localquery="label.groups:/(<groupID>|<groupID2>|<groupID3)/"localmatches=nk.match_list(query)for_,matchinipairs(matches)donk.logger_info(string.format("Match id %s",match.match_id))end
Server
1
2
3
4
5
6
7
8
9
10
11
query:="label.groups:/(<groupID>|<groupID2>|<groupID3)/"matches,err:=nk.MatchList(ctx,query)iferr!=nil{logger.WithField("err",err).Error("Match listings error.")return}for_,match:=rangematches{logger.Info("Match id %s",match.MatchId)}
Server
1
2
3
4
5
6
7
8
functionfindGroupsMatch(context: nkruntime.Context,logger: nkruntime.Logger,nk: nkruntime.Nakama){constquery="label.groups:/(<groupID>|<groupID2>|<groupID3)/";varmatches=nk.matchList(query);matches.forEach(function(match){logger.info("Match id '%s'",match.matchId);});}
이 예에서 대결 label에는 대결이 새로운 플레이어를 수락하는지 여부를 나타내는 open 값이 포함됩니다. 이 값은 적절한 기준이 충족되면 대결 핸들러에서 업데이트됩니다(예: 충분한 플레이어가 가입했거나 시작할 준비가 되었다고 표시되는 경우).
Server
1
2
3
4
5
6
7
8
localnk=require("nakama")localquery="+label.open:true label.game_mode:deathmatch"localmatches=nk.match_list(query)for_,matchinipairs(matches)donk.logger_info(string.format("Match id %s",match.match_id))end
Server
1
2
3
4
5
6
7
8
9
10
11
query:="+label.open:true label.game_mode:deathmatch"matches,err:=nk.MatchList(ctx,query)iferr!=nil{logger.WithField("err",err).Error("Match listings error.")return}for_,match:=rangematches{logger.Info("Match id %s",match.MatchId)}
Server
1
2
3
4
5
6
7
8
functionfindOpenMatches(context: nkruntime.Context,logger: nkruntime.Logger,nk: nkruntime.Nakama){constquery="+label.open:true label.game_mode:deathmatch";varmatches=nk.matchList(query);matches.forEach(function(match){logger.info("Match id '%s'",match.matchId);});}