2016-04-06 2 views
0

Я новичок в mongodb. У меня есть данные в формате JSON в mongodb. Мне нужно найти книгуLabel или shortLabel для книги, и она должна показать мне всю информацию о книге. Например: если я запрошу «Космос», он покажет все описание книги, например: bookLabel, writer, yearPublish, url. Как я могу это сделать в java? Нужна просьба, пожалуйста, помогите.Как выполнить поиск текстового запроса в mongodb?

"Class":"Science", 
    "Description":[ 
    { 
     "bookLabel":"Cosmos (Mass Market Paperback)", 
     "shortLabel":"Cosmos", 
     "writer":"Carl Sagan", 
     "yearPublish":[ 
      "2002" 
     ], 
     "url":"https://www.goodreads.com/book/show/55030.Cosmos" 
    }, 
    { 
     "bookLabel":"The Immortal Life of Henrietta Lacks", 
     "shortLabel":"Immortal Life", 
     "writer":"Rebecca Skloot", 
     "yearPublish":[ 
      "2010, 2011" 
     ], 
     "url":"https://www.goodreads.com/book/show/6493208-the-immortal-life-of-henrietta-lacks" 
    } 
    ], 
    "Class":"History", 
    "Description":[ 
    { 
     "bookLabel":"The Rise and Fall of the Third Reich", 
     "shortLabel":"Rise and Fall", 
     "writer":"William L. Shirer", 
     "yearPublish":[ 
      "1960" 
     ], 
     "url":"https://www" 
    } 
    ] 

}

+1

Пожалуйста, будьте более конкретным. Какой тип драйвера вы используете для Java-MongoDB? Возникает вопрос, как фильтровать файлы JSON или как запросить эти BSON (Mongo работает со специальным типом формата)? –

+0

Что вы пробовали? Это также очень легко неверно истолковать, и вы ошибаетесь в двух подходах. Либо используйте «регулярные выражения» для соответствия по нескольким полям с условием «$ или», либо индексируйте несколько полей с индексом «текст» и «$ text». Оба имеют свои плюсы и минусы, и есть много литературы уже по сравнению. Я предлагаю вам сначала разобраться, что вы делаете. –

ответ

0

Для этого вы можете использовать MongoDB в текст возможности поиска. Вам понадобится создать для вашей коллекции text index.

Прежде всего создайте текстовый индекс в своей коллекции по полям bookLabel и shortLabel.

db.books.createIndex({ "Description.bookLabel" : "text", "Description.shortLabel" : "text" }) 

Обратите внимание, что это будет сделано в Монго оболочки

Затем

DBObject command = BasicDBObjectBuilder 
        .start("text", "books") 
        .append("search", "Cosmos") 
        .get(); 

CommandResult result = db.command(command); 
BasicDBList results = (BasicDBList) result.get("results"); 

for(Object o : results) { 
    DBObject dbo = (DBObject) ((DBObject) o).get("obj"); 
    String id = (String) dbo.get("_ID"); 
    System.out.println(id); 
} 

ли на самом деле не проверял это. Но попробуйте. Должно сработать.

0

С MongoDB Java Driver v3.2.2 вы можете сделать что-то вроде этого:

FindIterable<Document> iterable = collection.find(Document.parse("{\"Description.shortLabel\": {$regex: \"Cosmos\"}")); 

Это возвращает все документы, содержащие Cosmos в гнездовой области Description.shortLabel. Для точного соответствия, попробуйте {"Description.shortLabel": "Cosmos"}. Замените shortLabel на bookLabel, чтобы найти поле bookLabel. Затем вы можете сделать iterable.forEach(new Block<Document>()) по возвращенным документам. Для поиска bookLabel и shortLabel, вы можете сделать $or{}. Мой синтаксис может быть неправильным, поэтому проверьте руководство MongoDB. Но это общая идея.

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