2015-04-09 3 views
0

я с «игрок» сбор и каждый документ будет выглядеть следующим образомМонго: Найти в ассоциативном массиве

{ 
    "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 все level_details которого player_id = 20 и is_compelted = истина и completed_on> = 1428512300 и completed_on < = 1428512500"

Так, в ответ я ожидал что-то вроде

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

может кто-нибудь сообщить мне, как мне это узнать?

+1

Являются ли даты хранятся в формате ISODate? – ZeMoon

+0

@ ZeMoon no, они хранятся в виде строк :-) –

+1

Боковое примечание: считается, что плохая практика должна иметь значения в качестве ключей, рекомендуется изменить вашу схему, чтобы включить в ваш объект поле 'id', которое действует как' level_detail', вместо идентификатора в качестве ключа. – chridam

ответ

1

Во-первых, вы должны изменить структуру документов, как показано ниже

{ 
    "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 и $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() 
+0

Могу ли я получить только level_data в ответе? – Avinash

+0

@ Avinash проверить мой отредактированный ответ с агрегацией – Yogesh

Смежные вопросы