![](/img/trans.png)
[英]Updating nested embedded array document in MongoDB using java driver 3.2
[英]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.