如何在mongodb中自定义搜索文本查询?

时间:2016-04-06 12:25:44

标签: java mongodb mongodb-query

我是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"
     }
  ]

}

2 个答案:

答案 0 :(得分:0)

为此,您可以使用MongoDB的文本搜索功能。您必须在集合中为此创建text index

首先在字段bookLabelshortLabel上为您的集合创建文本索引。

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>())。要同时搜索bookLabelshortLabel,您可以执行$or{}。我的语法可能有误,所以请查看MongoDB手册。但这是一般的想法。