Skip to content

File tree

11 files changed

+689
-72
lines changed

11 files changed

+689
-72
lines changed

content/java/upcoming/snooty.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ toc_landing_pages = [
1515
"/builders/aggregates",
1616
"/api-documentation",
1717
"/security/auth",
18+
"/integrations",
1819
]
1920

2021
sharedinclude_root = "https://raw.githubusercontent.com/10gen/docs-shared/main/"
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
4+
<modelVersion>4.0.0</modelVersion>
5+
<parent>
6+
<groupId>org.springframework.boot</groupId>
7+
<artifactId>spring-boot-starter-parent</artifactId>
8+
<version>3.2.5</version>
9+
<relativePath/> <!-- Lookup parent from repository -->
10+
</parent>
11+
<groupId>com.mongodb.examples</groupId>
12+
<artifactId>SpringDataBulkInsert</artifactId>
13+
<name>SpringDataBulkInsert</name>
14+
<description>SpringDataBulkInsert</description>
15+
<properties>
16+
<java.version>17</java.version>
17+
</properties>
18+
<dependencies>
19+
<!-- Spring Boot Web Starter -->
20+
<dependency>
21+
<groupId>org.springframework.boot</groupId>
22+
<artifactId>spring-boot-starter-web</artifactId>
23+
</dependency>
24+
25+
<!-- Spring Data MongoDB -->
26+
<dependency>
27+
<groupId>org.springframework.boot</groupId>
28+
<artifactId>spring-boot-starter-data-mongodb</artifactId>
29+
</dependency>
30+
31+
<!-- Lombok (optional, for annotations like @Getter/@Setter) -->
32+
<dependency>
33+
<groupId>org.projectlombok</groupId>
34+
<artifactId>lombok</artifactId>
35+
<optional>true</optional>
36+
</dependency>
37+
38+
<!-- Testing -->
39+
<dependency>
40+
<groupId>org.springframework.boot</groupId>
41+
<artifactId>spring-boot-starter-test</artifactId>
42+
<scope>test</scope>
43+
<exclusions>
44+
<exclusion>
45+
<groupId>org.junit.vintage</groupId>
46+
<artifactId>junit-vintage-engine</artifactId>
47+
</exclusion>
48+
</exclusions>
49+
</dependency>
50+
51+
<dependency>
52+
<groupId>net.datafaker</groupId>
53+
<artifactId>datafaker</artifactId>
54+
<version>2.4.3</version>
55+
</dependency>
56+
57+
<!-- Security (optional) -->
58+
<dependency>
59+
<groupId>io.github.hakky54</groupId>
60+
<artifactId>sslcontext-kickstart</artifactId>
61+
<version>8.3.7</version>
62+
</dependency>
63+
64+
</dependencies>
65+
66+
<build>
67+
<plugins>
68+
<!-- Spring Boot Maven Plugin -->
69+
<plugin>
70+
<groupId>org.springframework.boot</groupId>
71+
<artifactId>spring-boot-maven-plugin</artifactId>
72+
</plugin>
73+
</plugins>
74+
</build>
75+
76+
</project>
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.mongodb.examples.springdatabulkinsert;
2+
3+
import com.mongodb.ConnectionString;
4+
import com.mongodb.MongoClientSettings;
5+
import com.mongodb.client.MongoClient;
6+
import com.mongodb.client.MongoClients;
7+
import org.springframework.beans.factory.annotation.Value;
8+
import org.springframework.context.annotation.Bean;
9+
import org.springframework.context.annotation.Configuration;
10+
import org.springframework.data.mongodb.core.MongoTemplate;
11+
12+
13+
@Configuration
14+
public class MongoConfig {
15+
16+
@Value("${mongodb.uri}")
17+
private String uri;
18+
19+
@Value("${mongodb.database}")
20+
private String databaseName;
21+
22+
@Bean
23+
public MongoClient mongoClient() {
24+
ConnectionString connectionString = new ConnectionString(uri);
25+
MongoClientSettings mongoClientSettings = MongoClientSettings.builder()
26+
.applyConnectionString(connectionString)
27+
.build();
28+
return MongoClients.create(mongoClientSettings);
29+
}
30+
31+
@Bean
32+
public MongoTemplate mongoTemplate() throws Exception {
33+
return new MongoTemplate(mongoClient(), databaseName);
34+
}
35+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.mongodb.examples.springdatabulkinsert;
2+
3+
import org.slf4j.Logger;
4+
import org.slf4j.LoggerFactory;
5+
import org.springframework.beans.factory.annotation.Autowired;
6+
import org.springframework.beans.factory.annotation.Value;
7+
import org.springframework.boot.CommandLineRunner;
8+
import org.springframework.boot.SpringApplication;
9+
import org.springframework.boot.autoconfigure.SpringBootApplication;
10+
11+
// start-application
12+
@SpringBootApplication
13+
public class SpringDataBulkInsertApplication implements CommandLineRunner {
14+
15+
@Value("${documentCount}")
16+
private int count;
17+
private static final Logger LOG = LoggerFactory
18+
.getLogger(SpringDataBulkInsertApplication.class);
19+
20+
@Autowired
21+
private ProductRepository repository;
22+
23+
public static void main(String[] args) {
24+
SpringApplication.run(SpringDataBulkInsertApplication.class, args);
25+
}
26+
27+
@Override
28+
public void run(String... args) throws Exception {
29+
30+
repository.bulkInsertProducts(count);
31+
LOG.info("End run");
32+
System.exit(0);
33+
}
34+
}
35+
// end-application
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
package com.mongodb.examples.springdatabulkinsert;
2+
3+
import net.datafaker.Faker;
4+
import org.slf4j.Logger;
5+
import org.slf4j.LoggerFactory;
6+
import org.springframework.data.annotation.Id;
7+
import org.springframework.data.mongodb.core.mapping.Document;
8+
9+
import java.util.ArrayList;
10+
import java.util.Date;
11+
import java.util.Random;
12+
import java.util.List;
13+
14+
// start-products-class
15+
@Document("products")
16+
public class Product {
17+
18+
private static final Logger LOG = LoggerFactory.getLogger(Product.class);
19+
20+
@Id
21+
private String id;
22+
private String name;
23+
private int qty;
24+
private double price;
25+
private Date available;
26+
private Date unavailable;
27+
private String skuId;
28+
29+
public Product(String name, int qty, double price, Date available, Date unavailable, String skuId) {
30+
this.name = name;
31+
this.qty = qty;
32+
this.price = price;
33+
this.available = available;
34+
this.unavailable = unavailable;
35+
this.skuId = skuId;
36+
}
37+
38+
public static List<Product> randomProducts(int count) {
39+
40+
Faker faker = new Faker();
41+
Random rand = new Random();
42+
43+
List<Product> retProds = new ArrayList<>(count);
44+
for (int i = 0; i < count; ++i) {
45+
46+
Product product = new Product(faker.animal().name(),
47+
1 + rand.nextInt(998),
48+
10.0 + rand.nextInt(9999),
49+
new Date(), new Date(),
50+
faker.idNumber().valid());
51+
52+
retProds.add(product);
53+
}
54+
return retProds;
55+
}
56+
57+
// Getters and setters
58+
}
59+
// end-products-class
60+
61+
// public String getName() {
62+
// return name;
63+
// }
64+
65+
// public void setName(String name) {
66+
// this.name = name;
67+
// }
68+
69+
// public int getQty() {
70+
// return qty;
71+
// }
72+
73+
// public void setQty(int qty) {
74+
// this.qty = qty;
75+
// }
76+
77+
// public double getPrice() {
78+
// return price;
79+
// }
80+
81+
// public void setPrice(double price) {
82+
// this.price = price;
83+
// }
84+
85+
// public Date getAvailable() {
86+
// return available;
87+
// }
88+
89+
// public void setAvailable(Date available) {
90+
// this.available = available;
91+
// }
92+
93+
// public Date getUnavailable() {
94+
// return unavailable;
95+
// }
96+
97+
// public void setUnavailable(Date unavailable) {
98+
// this.unavailable = unavailable;
99+
// }
100+
101+
// public String getSkuId() {
102+
// return skuId;
103+
// }
104+
105+
// public void setSkuId(String skuId) {
106+
// this.skuId = skuId;
107+
// }
108+
// }
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package com.mongodb.examples.springdatabulkinsert;
2+
3+
import com.mongodb.WriteConcern;
4+
import com.mongodb.bulk.BulkWriteResult;
5+
import com.mongodb.client.result.UpdateResult;
6+
import org.slf4j.Logger;
7+
import org.slf4j.LoggerFactory;
8+
import org.springframework.beans.factory.annotation.Autowired;
9+
import org.springframework.data.mongodb.core.BulkOperations;
10+
import org.springframework.data.mongodb.core.MongoTemplate;
11+
import org.springframework.data.mongodb.core.query.Criteria;
12+
import org.springframework.data.mongodb.core.query.Query;
13+
import org.springframework.data.mongodb.core.query.Update;
14+
import org.springframework.stereotype.Repository;
15+
16+
import java.time.Duration;
17+
import java.time.Instant;
18+
import java.util.List;
19+
20+
// start-productrepo
21+
@Repository
22+
public class ProductRepository {
23+
24+
private static final Logger LOG = LoggerFactory
25+
.getLogger(ProductRepository.class);
26+
27+
private final MongoTemplate mongoTemplate;
28+
29+
@Autowired
30+
public ProductRepository(MongoTemplate mongoTemplate){
31+
this.mongoTemplate = mongoTemplate;
32+
}
33+
34+
35+
public void updateProductQuantity(String name, int newQuantity) {
36+
Query query = new Query(Criteria.where("name").is(name));
37+
Update update = new Update();
38+
update.set("quantity", newQuantity);
39+
40+
UpdateResult result = mongoTemplate.updateFirst(query, update, Product.class);
41+
42+
if (result == null)
43+
LOG.error("No documents updated");
44+
else
45+
LOG.info(result.getModifiedCount() + " document(s) updated..");
46+
}
47+
48+
public int bulkInsertProducts(int count) {
49+
50+
LOG.info("Dropping collection...");
51+
mongoTemplate.dropCollection(Product.class);
52+
LOG.info("Dropped!");
53+
54+
Instant start = Instant.now();
55+
mongoTemplate.setWriteConcern(WriteConcern.W1.withJournal(true));
56+
57+
List<Product> productList = Product.randomProducts(count);
58+
BulkOperations bulkInsertion = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, Product.class);
59+
60+
bulkInsertion.insert(productList);
61+
62+
BulkWriteResult bulkWriteResult = bulkInsertion.execute();
63+
64+
LOG.info("Bulk insert of " + bulkWriteResult.getInsertedCount() + " documents completed in " + Duration.between(start, Instant.now()).toMillis() + " milliseconds");
65+
return bulkWriteResult.getInsertedCount();
66+
}
67+
}
68+
// end-productrepo
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
2+
# start-mongoconfig-properties
3+
mongodb.database=bulk
4+
mongodb.uri=<connection string>
5+
documentCount=25000
6+
# end-mongoconfig-properties

0 commit comments

Comments
 (0)