简体   繁体   English

MongoDB:使用Java驱动程序在具有给定属性的数组中查找匹配元素

[英]Mongodb : find matching elements in an array with given attributes using java driver

Trying to migrate my game to mongodb (linux-i686-2.4.6) but so far having a lot of struggle :( one is that; I have a collection named gamesTable with the following elements below and I want to make a search in playerHistories array. 试图将我的游戏迁移到mongodb(linux-i686-2.4.6),但到目前为止仍然有很多困难:(一个是;我有一个名为gamesTable的集合,下面带有以下元素,我想在playerHistories中进行搜索阵列。

{
"_id": {
    "$oid": "52307b8fe4b0fc612dea2c70"
},
"id": "52307b8fe4b0fc612dea2c70", "name": "poker", "initTime": 1378909071070, "startTime": 1378909071098, "endTime": 1378909071134,
"playerHistories": [
    {
        "playerId": "52307b8fe4b0fc612dea2c6e",
        "time": 1378909071098,
        "event": "EnteredGame"
    } ,
    {
        "playerId": "52307b8fe4b0fc612dea2c6f",
        "time": 1378909071098,
        "event": "EnteredGame"
    } ,
    {
        "playerId": "52307b8fe4b0fc612dea2c6f",
        "time": 1378909071117,
        "event": "LostGame"
    } ,
    {
        "playerId": "52307b8fe4b0fc612dea2c6e",
        "time": 1378909071128,
        "event": "WonGame"
    }
]
},
{
"_id": {
    "$oid": "52307b8fe4b0fc612dea2c71"
}, "id": "52307b8fe4b0fc612dea2c71", "name": "poker", "initTime": 1378909071150, "startTime": 1378909071165, "endTime": 1378909071189,
"playerHistories": [
    {
        "playerId": "52307b8fe4b0fc612dea2c6e",
        "time": 1378909071165,
        "event": "EnteredGame"
    } ,
    {
        "playerId": "52307b8fe4b0fc612dea2c6f",
        "time": 1378909071165,
        "event": "EnteredGame"
    } ,
    {
        "playerId": "52307b8fe4b0fc612dea2c6e",
        "time": 1378909071176,
        "event": "LostGame"
    } ,
    {
        "playerId": "52307b8fe4b0fc612dea2c6f",
        "time": 1378909071183,
        "event": "WonGame"
    }
]
}

and I want to find games won by a player, in our example it is; 我希望找到一个玩家赢得的游戏,在我们的例子中它是;

{ "playerHistories.playerId" : "52307b8fe4b0fc612dea2c6f" , "playerHistories.event" : "WonGame"}}

I read that I should use $elemMatch for matching elements in an array however it returns nothing :( 我读到我应该使用$ elemMatch来匹配数组中的元素但是它什么都不返回:(

here is the code I use 这是我使用的代码

    BasicDBObject elemMatch = new BasicDBObject();
    elemMatch.put("playerHistories.playerId", player1.getId());
    elemMatch.put("playerHistories.event", "WonGame");
    BasicDBObject foo = new BasicDBObject();
    foo.put("$elemMatch", elemMatch);
    gamesTable.find(foo);

What am I doing wrong? 我究竟做错了什么?

thanks to parvin I find it out changing his solution. 感谢parvin我发现它改变了他的解决方案。

    DBObject statusQuery = new BasicDBObject("event", "WonGame");
    statusQuery.put("playerId", "52307b8fe4b0fc612dea2c6f");
    DBObject fields = new BasicDBObject("$elemMatch", statusQuery);
    DBObject query = new BasicDBObject("playerHistories",fields);
    gamesTable.find(query);

You can do it as follows : 你可以这样做:

        DBObject query = new BasicDBObject("playerHistories.playerId", "52307b8fe4b0fc612dea2c6f");

        DBObject statusQuery = new BasicDBObject("event", "WonGame");
        DBObject elemMatchQuery = new BasicDBObject("$elemMatch", statusQuery);

        DBObject fields = new BasicDBObject();
        fields.put("playerHistories", elemMatchQuery);
        fields.put("initTime", 1);
        fields.put("startTime", 1);
        fields.put("endTime", 1);

        DBCursor cur = coll.find(query, fields);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM