如何在给定产品id列表的产品集合中删除productData



我有一个文档,其中有一个字段,我想删除给定的id列表。下面是集合中名为products的对象之一:给定一个productid列表,删除这些productid的productData字段。方法签名是这样的

//return productIds whose productData field has been deleted
public List<ProductId> deleteProductDataForIds(List<ProductId> productIds);

ProductId是一个类似于下面所示的数组,表示为一个ProductId类,产品JSON如下所示,为简洁起见省略了其他字段:

{
"_id" : {
"productId" : P202,
"categoryId" : 111
},
"productData" : {
"description": "Paco Rabane Fragrance",
"productSku": "11222-RTTTT"
},
"productName: "Paco Rabanne",
"qty": 1222222,
... other fields omitted for brevity
}

我想使用Spring Data Mongo,删除给定的_id值列表的productData。例如,给定下面的productid列表,删除所有相关的productData。

[ 
{
"_id": {
"productId": 112, 
"category" : "444""
},
"_id": {
"productId": 132, 
"category" : "445""
}
]

我把一些代码放在一起尝试删除,但是我被如何添加删除部分所困扰。

var productId = new ProductId(1122, 122);
BulkOperations bulkOps =  mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED,
Product.class,  "products");
List<Pair<Query, Update>> updates = new ArrayList<>();
// This is not where I'm stuck adding code to delete productData 
products.forEach(product -> updates.add(Pair.of(where("productId", 
product.getProductId()),set(product))));
log.info("Writing to database {} ",updates );
}

//Helper method for add clause
private static Query where(String field, Object value) {
return new Query().addCriteria(Criteria.where(field).is(value));
}

我不确定updateMulti可以使用。我可以使用它来更新产品,但不确定如何删除产品id列表的productData。

您需要使用MongoTemplate.remove(...)方法:

注意:它返回DeleteResult,允许您验证已删除的文档(DeleteResult.getDeletedCount())

public DeleteResult deleteProductDataForIds(List<ProductId> productIds) {
Query query = Query.criteria(Criteria.where("_id").in(productIds));
return mongoTemplate.remove(query, Product.class);
//Query: { "_id" : { "$in" : [ { "$java" : ProductId@6d969330 }, { "$java" : ProductId@4861cca9 } ] } }, Fields: {}, Sort: {}
}

您可以使用Criteria。

public DeleteResult deleteProductDataForIds(List<ProductId> productIds) {
Query query = Query.query(new Criteria().orOperator(productIds.stream()
.map(p -> Criteria.where("_id.productId").is(p.getProductId()).and("_id.categoryId").is(p.getCategoryId()))
.collect(Collectors.toList()))
);
return mongoTemplate.remove(query, Product.class);
//Query: { "$or" : [{ "_id.productId" : 112, "_id.categoryId" : "445"}, { "_id.productId" : 132, "_id.categoryId" : "444"}]}, Fields: {}, Sort: {}
}

最新更新