簡體   English   中英

使用 Java 驅動程序過濾 mongodb 文檔中的嵌入數組 object

[英]Filter embedded Array object in mongodb document using Java driver

我有以下數據,我想過濾_id = "63283dd5777142017baa763b"subCategory._id = "63283e25777142017baa7641"的數據

{
    "_id": ObjectId("63283dd5777142017baa763b"),
    "name": "Men",
    "description": "Men",
    "subCategory": [{
            "name": "ssss",
            "description": "ss",
            "_id": ObjectId("63283e1f777142017baa7640")
        },
        {
            "name": "aa",
            "description": "aa",
            "_id": ObjectId("63283e25777142017baa7641")
        }
    ]
}

使用 MongoClient 如下

@Singleton
public record MongoDbRepository(MongoClient mongoClient, MongodbConfiguration mongodbConfiguration) implements IMongoRepository {
    @Override
    public <T> MongoCollection<T> getCollection(String collectionName, Class<T> typeParameterClass) {
        return mongoClient
                .getDatabase(mongodbConfiguration.database())
                .getCollection(collectionName, typeParameterClass);
    }
}

並從 MongoClient 獲取數據

@Override
public Mono<SubCategoryModel> find(String categoryId, String id) {
    Bson query = filters.add(and(eq("_id", new ObjectId(categoryId)),eq("subCategory._id", new ObjectId(id))));
    return Mono.from(iMongoRepository.getCollection(ConstantValues.PRODUCT_CATEGORY_COLLECTION_NAME, Category.class)
                    .find(query))
            .map(item -> {
                var element = item.getSubCategory().stream().findFirst().get();
                return new SubCategoryModel(element.get("_id").toString(), element.get("name").toString(), element.get("description").toString());
            });
}

使用過濾器filters.add(and(eq("_id", new ObjectId(categoryId)),eq("subCategory._id", new ObjectId(id)))) ,它返回兩個值。 它沒有過濾subCategory._id = ObjectId("63283e25777142017baa7641")

我認為您還需要提供一個投影,以選擇匹配的數組元素,如下所示:

@Override
public Mono<SubCategoryModel> find(String categoryId, String id) {
    Bson query = filters.add(and(eq("_id", new ObjectId(categoryId)),eq("subCategory._id", new ObjectId(id))));
    Bson projectionFields = Projections.fields(Projections.include("name", "description", "subCategory.$"));
    return Mono.from(iMongoRepository.getCollection(ConstantValues.PRODUCT_CATEGORY_COLLECTION_NAME, Category.class)
                    .find(query).projection(projectionFields))
            .map(item -> {
                var element = item.getSubCategory().stream().findFirst().get();
                return new SubCategoryModel(element.get("_id").toString(), element.get("name").toString(), element.get("description").toString());
            });
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM