有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java从mongodb获取随机值

我目前有一个MongoDB数据库,其中有一个名为words的集合,其中包含芒果和苹果。我如何在我的程序中随机获得这些数据。这需要在chooseRandomWord()方法中实现。当前运行应用程序时,输出为“所选单词为:com.mongodb.client.internal”。Java8AggregateIterableImpl@2bbf4b8b “。我需要从该集合中随机选择任何项目。我数据库中的apple和mango值称为“name”。所有代码如下:

import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Aggregates;
import org.bson.Document;

import java.util.Arrays;
import java.util.Scanner;


public class Game {
    MongoClient client = MongoClients.create("mongodb://localhost:27017");
    MongoDatabase database = client.getDatabase("chosenWord");
    MongoCollection<Document> wordCollection = database.getCollection("words");
    //Player empty objects
    private final Player playerOne;
    private final Player playerTwo;
    private static final int maxScore = 5;
    private static String chosenWord;
    //Default is true but can alter BEFORE initialization of class
    public static Boolean canStartGame = true;
    //TODO: Try to get these from MongoDB?
    String[] words = new String[]
            {"banana", "apple", "pineapple",
                    "mango", "oranges", "watermelon"};

    public Game(Player playerOne, Player playerTwo) {
        this.playerOne = playerOne;
        this.playerTwo = playerTwo;
        //Set up chosen word and display
        init();

        if (canStartGame)
            startMakingMoves();
    }

    private void init(){
        //Get chosen word from chooseRandomWord
        chosenWord = chooseRandomWord();
        display(chosenWord);
    }

    //Players start making moves
    private void startMakingMoves(){
        makeMove();
    }

    //Display given word
    private void display(String chosenWord){
        System.out.println("The chosen word is: " + chosenWord);
    }

    //TODO: Write test for getting random word
    public String chooseRandomWord() {
        wordCollection.aggregate(Arrays.asList(Aggregates.sample(1)));
        return wordCollection.toString();
        //int randomNumber = new Random().nextInt(words.length);
        //return words[randomNumber];
    }

    private void makeMove() {
        int i = 0;
        while (i <= maxScore) {
            //Player One
            System.out.print(playerOne.getName() + "'s move: ");
            playerMove(playerOne);
            if (playerOne.getScore() == maxScore)
                break;

            //Player Two
            System.out.print(playerTwo.getName() +"'s move: ");
            playerMove(playerTwo);
            if (playerTwo.getScore() == maxScore)
                break;

            i++;
        }
    }

    public void playerMove(Player player)  {
        Scanner scanner = new Scanner(System.in);
        String playerGuess = "";

        //System.out.println(b);

        boolean canRun = true;
        while(canRun) {
            playerGuess = scanner.nextLine();
            //TODO: Change this to check playerGuess is not null or a silly value using regex
            if (playerGuess.matches((".*?([a-z_]*\\?+[a-z_]*).*?"))) {
                System.out.println("You must enter a valid guess");
            } else canRun = false;
        }

        if (chosenWord.contains(playerGuess)) {
            int playerScore = player.getScore();
            playerScore++;
            player.setScore(playerScore);
            player.addMatchedWords(playerGuess);
            System.out.println("That's correct, Your score is: " + player.getScore());
            determineWinner(player);
        } else {
            System.out.println("That's incorrect, Your score is: " + player.getScore());
        }
    }

    public String determineWinner(Player player) {
        int playerScore = player.getScore();
        String winnerText = "";

        if (playerScore == maxScore) {
            winnerText = player.getName() + " is the winner!";
            System.out.println(winnerText);
        }
        return winnerText;
    }
}

共 (1) 个答案

  1. # 1 楼答案

    public String chooseRandomWord() { 
        return wordCollection.aggregate(Arrays.asList(Aggregates.sample(1)))
            .map(doc -> doc.getString("name"))
            .into(new ArrayList<>()).get(0);
    }