我是mongodb的新手。我在mongodb中将以下数据作为JSON格式。我需要在bookLabel或shortLabel上搜索这本书,它应该向我展示关于这本书的所有信息。例如:如果我查询“Cosmos”,它将显示有关该书的所有描述,例如:bookLabel,writer,yearPublish,url。我怎么能在java中这样做?需要查询,请帮忙。
"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"
}
]
}
答案 0 :(得分:0)
为此,您可以使用MongoDB的文本搜索功能。您必须在集合中为此创建text index
。
首先在字段bookLabel
和shortLabel
上为您的集合创建文本索引。
db.books.createIndex({ "Description.bookLabel" : "text", "Description.shortLabel" : "text" })
请注意,这是在Mongo shell中完成的
然后
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);
}
还没有真正测试过这个。但试一试。应该工作。
答案 1 :(得分: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手册。但这是一般的想法。