Mongo: 在关联数组中查找

Mongo: Find in associative array

我有 "player" 个集合,每个文档看起来像这样

{
    "player_id": 20,
    "level_details": {
        "12": {
            "is_completed": false,
            "level_data": "oijoisdffs",
            "completed_on": 1428570153
        },
        "13": {
            "is_completed": true,
            "level_data": "lfsdfjfjg",
            "completed_on": 1428512384
        },
        "14": {
            "is_completed": true,
            "level_data": "oafodjfosf",
            "completed_on": 1318374857
        },
        "15": {
            "is_completed": false,
            "level_data": "sdmflskfmm",
            "completed_on": 1428938475
        }
   }

}

我想在单个文档上触发以下查询, "Fetch all level_details whose player_id = 20 and is_compelted = true and completed_on >= 1428512300 and completed_on <= 1428512500"

所以,在响应中我期待类似

{
"level_details": {
    "13": {
        "is_completed": true,
        "level_data": "lfsdfjfjg",
        "completed_on": 1428512384
    }
}
}

任何人都可以让我知道我应该如何实现这个?

首先你应该改变你的文件结构如下

{
    "player_id": 20,
    "level_details": [
    {
        "is_completed": false,
        "level_data": "oijoisdffs",
        "completed_on": 1428570153
    },
    {
        "is_completed": true,
        "level_data": "lfsdfjfjg",
        "completed_on": 1428512384
    },
    {
        "is_completed": true,
        "level_data": "oafodjfosf",
        "completed_on": 1318374857
    },
    {
        "is_completed": false,
        "level_data": "sdmflskfmm",
        "completed_on": 1428938475
    }
    ]
}

现在根据您的要求,您应该使用两种方式找到您的结果

1> 使用简单的 find and $elemMatch 如下

db.collectionName.find({
    "$and": [{
    "player_id": 20
    }, {
    "level_details": {
        "$elemMatch": {
            "completed_on": {
                "$gte": 1428512300
            }
        }
    }
    }, {
    "level_details": {
        "$elemMatch": {
            "completed_on": {
                "$lte": 1428512500
            }
        }
    }
    }, {
    "level_details": {
        "$elemMatch": {
            "is_completed": true
        }
    }
    }]
}, {
    "level_details.$": 1
}).pretty()

2> Mongo aggrgation 查询如下

db.collectionName.aggregate({
    "$unwind": "$level_details"
}, {
    "$match": {
    "$and": [{
        "player_id": 20
    }, {
        "level_details.completed_on": {
            "$gte": 1428512300
        }
    }, {
        "level_details.completed_on": {
            "$lte": 1428512500
        }
    }, {
        "level_details.is_completed": true
    }]
    }},
    {
   "$project": {
    "level_data": "$level_details.level_data", // Finding only level_data
    "_id": 0
    }
    }).pretty()