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()
我有 "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()