我有这个 factory
集合:
@Document(collection = "factory")
public class Factory
{
Private List<Product> products;
}
将Product
嵌入产品中。
当我需要向现有工厂添加产品时:
@Autowired
private FactoryRepository factoryRepository;
public void addProduct(Long id, Product product) {
Factory f = factoryRepository.findById(id);
f.addProduct(product);
factoryRepository.save(f);
}
然而,问题在于产品是一个包含一组重属性的大对象,并且工厂可以有2000个产品。因此,即使在本阶段不需要,检索到的工厂也会导致大量内存消耗。是否有一种方法可以将新产品对象直接附加到工厂文档中,而无需读取整个对象?
public void addProduct(Long id, Product product) {
Document find = new Document("_id",id);
Document listItem = new Document("products",product);
Document push = new Document("$push", listItem);
collection.updateOne(find,push);
}
这会导致错误:
org.bson.codecs.configuration.CodecConfigurationException:
Can't find a codec for class product
所以我修改代码,在push之前将其转换为字符串形式:
public void addProduct(Long id, Product product) {
Document find = new Document("_id",id);
ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter();
Document listItem = new Document("products",ow.writeValueAsString(product));
Document push = new Document("$push", listItem);
collection.updateOne(find,push);
}
这个对象被正确地推送,但读取时出现了问题:
org.springframework.core.convert.ConverterNotFoundException:
No converter found capable of converting from type [java.lang.String] to type [Product]
然而,我在这里得不到任何进展。有没有解决这个问题的想法?
factory
中有多少个Factory
对象?是只有一个工厂持有所有产品吗?如果是这样,你应该使用集合products
,在其中可以直接插入Product
对象。 - bkis