我在使用 MongoDB 查询时遇到问题。每当我尝试通过 ID 或任何其他字段查找时,我总是得到零结果。而且我也无法使用“喜欢”运算符。
我想查询的是不区分大小写的书名。我知道你可以在 MongoDB 中这样做:
{title: {$regex: /^query.*/i}}
我尝试用 Panache 做到这一点,但我无法让它工作:
Book.find("title like ?1", "/^" + query + ".*/i");
我在控制台上看到以下行被打印出来:{'title':{'$regex':'/^Harr.*/i'}}
我也用文档尝试过,但也没有成功:
Document query = new Document();
query.put("title", "$regex: /^" + query + ".*/i");
Book.find(query);
我得到零结果。
这是我的书课:
public class Book extends PanacheMongoEntity {
@NotEmpty
public String title;
@NotEmpty
public String isbn;
@NotEmpty
public String author;
@Min(1)
@NotNull
public BigDecimal price;
}
这是我的 BookResource:
@Produces(APPLICATION_JSON)
@Consumes(APPLICATION_JSON)
@Path("/books")
public class BookResource {
@GET
public List<Book> get() {
return Book.listAll();
}
@GET
@Path("/{id}")
public Book find(@PathParam("id") String id) {
return (Book) Book.findByIdOptional(id).orElseThrow(() -> new NotFoundException("Book not found"));
}
@GET
@Path("/title/{title}")
public PanacheQuery<PanacheMongoEntityBase> findByTitle(@PathParam("title") String title) {
Document query = new Document();
// query.put("title", new BasicDBObject("$regex", ).append("$options", "i"));
return Optional.ofNullable(Book.find("title like ?1", format("/^%s.*/i", title))).orElseThrow(() -> new NotFoundException("Book not found"));
}
@POST
public void add(@Valid Book book) {
Book.persist(book);
}
@PUT
@Path("/{id}")
public void update(@PathParam("id") String id, @Valid Book book) {
Book result = Book.findById(id);
if (result != null) {
result.author = book.author;
result.isbn = book.isbn;
result.price = book.price;
result.title = book.title;
Book.update(result);
}
}
}
当我通过 curl 执行 findAll 时,我得到了这个:
[
{
"id": "5eb9475b8a4314145246cc10",
"author": "J.K. Rowling",
"isbn": "12345678",
"price": 24.95,
"title": "Harry Potter 1"
},
{
"id": "5eb95a758a4314145246cc25",
"isbn": "456",
"price": 0,
"title": "Java for dummies"
},
{
"id": "5eb95b1a8a4314145246cc27",
"author": "steven king",
"isbn": "456",
"price": 10,
"title": "IT"
}
]
当我尝试通过 id 查找 Book 时,我也得到零结果:
curl -X GET "http://localhost:8080/books/5eb9475b8a4314145246cc10" -H "accept: application/json"
=> 404 No Books found.
似乎唯一有效的操作是 POST(持久化),其余方法不返回任何内容。
我有以下设置:
- 通过 Docker 运行的 MongoDB 4.2
- 夸库斯 1.4.2
- JDK 11
这是我的application.properties:
quarkus.mongodb.connection-string=mongodb://localhost:27017
quarkus.mongodb.database=books
quarkus.log.category."io.quarkus.mongodb.panache.runtime".level=DEBUG