2013-05-08 2 views
2

Вот мой документ mongodb со встроенными документами. «События» - это список документов (BasicDBList), в которых каждый документ хранится с ключом как некоторая дата (например, 1 января 2013 года), а значение - это множество полей. Структура определена таким образом, чтобы я мог получить все события, произошедшие в какой-то день (например, 1 января 2013 г.).mongodb query embedded doc key как дата

У меня есть два вопроса:

  1. есть лучший способ структурировать этот документ? Я не уверен, что ключ в качестве даты - хорошая идея, но в то же время я хочу, чтобы легко достал все документы и сохранил их в памяти на основе даты. Когда Я извлекаю документы, я хочу, чтобы Hashtable с ключом считался датой и значением в качестве списка документов для этой даты (с использованием Java).

  2. Как получить документы, отправив дату? Например, я хочу все документы с ключом как 1 января 2013 года. Какой будет запрос в Java?

{ 
    "_id": { 
    "_time": 1367928493, 
    "_machine": -1914548796, 
    "_inc": -1784811303, 
    "_new": false 
    }, 
    "email": "[email protected]", 
    "events": { 
    "Jan 1, 2013": [ 
     { 
     "desc": "My Desc", 
     "title": "My Title", 
     "createDateTime": "May 7, 2013 8:08:13 AM", 
     "updateDateTime": "May 7, 2013 8:08:13 AM" 
     }, 
     { 
     "desc": "My Desc2", 
     "title": "My Title2", 
     "createDateTime": "May 7, 2013 8:08:13 AM", 
     "updateDateTime": "May 7, 2013 8:08:13 AM" 
     } 
    ], 
    "Feb 1, 2013": [ 
     { 
     "desc": "My Desc3", 
     "title": "My Title3", 
     "createDateTime": "May 8, 2013 8:08:13 AM", 
     "updateDateTime": "May 7, 2013 8:08:13 AM" 
     }, 
     { 
     "desc": "My Desc3", 
     "title": "My Title3", 
     "createDateTime": "May 8, 2013 8:08:13 AM", 
     "updateDateTime": "May 8, 2013 8:08:13 AM" 
     } 
    ] 
    } 
} 

Спасибо

+0

Вы запрашиваете конкретную дату на конкретном документе или на всех документах? –

+0

У меня есть два требования: 1) Получить все документы на все даты. 2) Извлечь все документы за определенную дату. –

ответ

0

Как правило, вы не можете запросить по ключу JSon, но вы можете использовать этот трюк:

db.things.find({ key : { $exists : true } }); 

этот запрос должен найти документ, который имеет конкретный ключ

Однако я считаю, что это не б для решения вашего вопроса. Во-первых, объект событий документа кажется непредсказуемым в будущем, это то, чего мы должны избегать при разработке схемы, поскольку по мере роста документа mongodb должен переместить дисковое пространство для его хранения, что вызовет проблемы с производительностью.

Я рекомендую хранить объект событий в отдельной коллекции, поля «владелец» и «дата» - это то, что вы будете запрашивать.

{ 
    "owner":"[email protected]", 
    "date":"Jan 1, 2013", 
    "events":[ 
    { 
     "desc": "My Desc", 
     "title": "My Title", 
     "createDateTime": "May 7, 2013 8:08:13 AM", 
     "updateDateTime": "May 7, 2013 8:08:13 AM" 
    } 
    ] 
} 
+0

Когда я использовал find $ exists: true, как указано в вашем комментарии, я получал все события для всех дат для структуры документа, которые у меня есть в моем вопросе. Но независимо от этого мне очень нравится ваше предложение о схеме. Это упрощено и имеет смысл. Огромное спасибо. –