2

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.

{
"_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 :(

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?

2 Answers 2

5

thanks to parvin I find it out changing his solution.

    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);
Sign up to request clarification or add additional context in comments.

Comments

2

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);

2 Comments

no luck, returns all the elements. I am not sure if you wrote DBObject statusQuery = new BasicDBObject("event", "WonGame"); intentionally or you just missed that 'event' is also a member of an object in the array.
It is written intentionally. I have inserted same data on my local machine and everything works fine for me. It should project the results that matched with the given query.Most probably you missed something. Check it again.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.