0

我正在使用 panache 来查询 MongoDb,在创建查询文档时,参数位于列表中。

通常我在搜索字段单元时会这样查询

PanacheQuery<BasicInfo> basicInfoPanacheQuery;
Document document = new Document();

document.add("unit", 1);
basicInfoPanacheQuery = BasicInfo.find(document).page(Page.of(page, PAGE_SIZE));

但是,我现在将单元作为列表/数组,如下所示,

List<Integer> units = List.of(1,2);

即使它们共享相同的键但值是列表或数组,我如何搜索单元。

4

2 回答 2

1

要查询某个字段是否在列表中,您可以通过两种方式进行:使用$or$in

带有 Panache 的 MongoDB 允许使用文档、原始 JSON 查询或 PanacheQL(一种接近 JPA 查询语言的指定查询语言)进行查询。

所有这些形式都应该是等效的(未经测试),您可以使用您认为最简单的一种:

// using Document
BasicInfo.find(new Document("$or", new Document("uuid", 1).append("uuid", 2)));
BasicInfo.find(new Document("uuid", new Document("$id", List.of(1, 2))));
// using a raw JSON query
BasicInfo.find("{'$or': {'uuid':1, 'uuid':2}}");
BasicInfo.find("{'uuid': {'$in': [1, 2]}}");
// using Panache QL
BasicInfo.find("uuid in (1,2)");
// or cannot be used in PanacheQL with multiple times the same field name
于 2021-05-21T12:32:03.190 回答
0

我终于想出了如何做到这一点

// use bison filters
Bson bson = Filters.or(Filters.eq("unit", 1), Filters.eq("unit", 2));

// convert the bson to a Document
Document bsonDocument = bsonToDocument(searchBson.toBsonDocument(BsonDocument.class,
        MongoClientSettings.getDefaultCodecRegistry()));

// then pass the document to the panache query
basicInfoPanacheQuery = BasicInfo.find(bsonDocument).page(Page.of(page, PAGE_SIZE));

// converting a son to a document
public static Document bsonToDocument(BsonDocument bsonDocument) {
    DocumentCodec codec = new DocumentCodec();
    DecoderContext decoderContext = DecoderContext.builder().build();
    return codec.decode(new BsonDocumentReader(bsonDocument), decoderContext);
  }
于 2021-05-20T10:15:38.153 回答