有 Java 编程相关的问题?

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

Mongodb java查找文档并过滤数组字段(删除不符合条件的数组数据)

我试图请求一个集合,但无法过滤嵌入的数组。我想获取集合中匹配{“players.nick”:nick}的所有文档,并过滤“players”数组,只获取搜索到的玩家

以下是初步文件:

{"_id":2000,"type":3,"prizepool":6520.5,"name":"XXX","start":1515701700,"end":1515719580,"buyin":2.25,"rake":0.5,"prize":0,"bounty":2.25,"players":[{"nick":"player1","rank":1,"cash":660.85,"kill":468.64,"ticket":0,"reentry":0},{"nick":"player2","rank":2,"cash":430.35,"kill":101.31,"ticket":0,"reentry":0},{"nick":"player3","rank":3,"cash":312.98,"kill":72.26,"ticket":0,"reentry":0},{"nick":"player4","rank":4,"cash":237.99,"kill":27.15,"ticket":0,"reentry":1}]}

请求之后,我想检索:

{"_id":2000,"type":3,"prizepool":6520.5,"name":"XXX","start":1515701700,"end":1515719580,"buyin":2.25,"rake":0.5,"prize":0,"bounty":2.25,"players":[{"nick":"player1","rank":1,"cash":660.85,"kill":468.64,"ticket":0,"reentry":0}}

有人知道如何用java的方式做到这一点吗

谢谢


共 (1) 个答案

  1. # 1 楼答案

    您可以在java中使用下面的聚合管道

    MongoClient mc = new MongoClient();
    MongoDatabase db = mc.getDatabase(db);
    MongoCollection col = db.getCollection(col);
    

    对于单个匹配,可以使用$elemMatch投影

    col.find().projection(Projections.fields(Projections.include("_id","type", "prizepool","name","start","end","buyin","rake","prize","bounty"),
                    Projections.elemMatch("players", Filters.eq("nick", "player1"))));
    

    适用于单人房和单人房;多重匹配

    Bson filter = new Document("players", Document.parse("{\n" +
                "            $filter: {\n" +
                "               input: \"$players\",\n" +
                "               as: \"player\",\n" +
                "               cond: { $eq: [ \"$$player.nick\", \"player1\" ] }\n" +
                "            }\n" +
                "         }"));
    Bson addFields = new Document("$addFields", filter);
    col.aggregate(Arrays.asList(addFields));