Skip to content
Closed
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions snooty.toml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ toc_landing_pages = [
"/api-documentation",
"/security",
"/security/auth",
"/integrations"
]

sharedinclude_root = "https://raw.githubusercontent.com/10gen/docs-shared/main/"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.mongodb.examples.springdatabulkinsert;

import com.mongodb.ConnectionString;
import com.mongodb.MongoClientSettings;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.core.MongoTemplate;

// start-mongoconfig
@Configuration
public class MongoConfig {
@Value("${mongodb.uri}")
private String uri;
@Value("${mongodb.database}")
private String databaseName;

@Bean
public MongoClient mongo() {

ConnectionString connectionString = new ConnectionString(uri);

MongoClientSettings mongoClientSettings = MongoClientSettings.builder()
.applyConnectionString(connectionString)
.build();


return MongoClients.create(mongoClientSettings);
}

@Bean
public MongoTemplate mongoTemplate() throws Exception {
return new MongoTemplate(mongo(), databaseName);
}
}
// end-mongoconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.mongodb.examples.springdatabulkinsert;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

// start-application
@SpringBootApplication
public class MyProjectName implements CommandLineRunner {

@Value("${documentCount}")
private int count;
private static final Logger LOG = LoggerFactory
.getLogger(MyProjectName.class);

@Autowired
private ProductRepository repository;

public static void main(String[] args) {
SpringApplication.run(MyProjectName.class, args);
}

@Override
public void run(String... args) throws Exception {

repository.bulkInsertProducts(count);
LOG.info("End run");
System.exit(1);
}
}
// end-application
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
package com.mongodb.examples.springdatabulkinsert;

import net.datafaker.Faker;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

import java.util.Date;
import java.util.Random;

// start-products-class
@Document("products")
public class Product {

private static final Logger LOG = LoggerFactory
.getLogger(Products.class);

@Id
private String id;
private String name;
private int qty;
private double price;
private Date available;
private Date unavailable;
private String skuId;

public Product(String name, int qty, double price, Date available, Date unavailable, String skuId) {
this.name = name;
this.qty = qty;
this.price = price;
this.available = available;
this.unavailable = unavailable;
this.skuId = skuId;
}

public static Product [] RandomProducts( int count) {

Faker faker = new Faker();
Random rand = new Random();

Product [] retProds = new Product[count];
for (int i=0; i<count; ++i) {

Product p = new Product( faker.animal().name(),
1+rand.nextInt(998),
10.0+rand.nextInt(9999),
new Date(), new Date(),
faker.idNumber().valid());

retProds[i] = p;
}
return retProds;
}

// Getters and setters
}
// end-products-class

// public String getName() {
// return name;
// }

// public void setName(String name) {
// this.name = name;
// }

// public int getQty() {
// return qty;
// }

// public void setQty(int qty) {
// this.qty = qty;
// }

// public double getPrice() {
// return price;
// }

// public void setPrice(double price) {
// this.price = price;
// }

// public Date getAvailable() {
// return available;
// }

// public void setAvailable(Date available) {
// this.available = available;
// }

// public Date getUnavailable() {
// return unavailable;
// }

// public void setUnavailable(Date unavailable) {
// this.unavailable = unavailable;
// }

// public String getSkuId() {
// return skuId;
// }

// public void setSkuId(String skuId) {
// this.skuId = skuId;
// }
// }
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package com.mongodb.examples.springdatabulkinsert;

import com.mongodb.WriteConcern;
import com.mongodb.bulk.BulkWriteResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.BulkOperations;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Component;

import java.time.Duration;
import java.time.Instant;

// start-productrepo
@Component
public class ProductRepository {

private static final Logger LOG = LoggerFactory
.getLogger(ProductRepository.class);

private final MongoTemplate mongoTemplate;

@Autowired
public ProductRepository(MongoTemplate mongoTemplate){
this.mongoTemplate = mongoTemplate;
}


public void updateProductQuantity(String name, int newQuantity) {
Query query = new Query(Criteria.where("name").is(name));
Update update = new Update();
update.set("quantity", newQuantity);

UpdateResult result = mongoTemplate.updateFirst(query, update, Product.class);

if(result == null)
LOG.error("No documents updated");
else
LOG.info(result.getModifiedCount() + " document(s) updated..");
}

public int bulkInsertProducts(int count) {

LOG.info("Dropping collection...");
mongoTemplate.dropCollection(Product.class);
LOG.info("Dropped!");

Instant start = Instant.now();
mongoTemplate.setWriteConcern(WriteConcern.W1.withJournal(true));

Product [] productList = Product.RandomProducts(count);
BulkOperations bulkInsertion = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, Product.class);

for (int i=0; i<productList.length; ++i)
bulkInsertion.insert(productList[i]);

BulkWriteResult bulkWriteResult = bulkInsertion.execute();

LOG.info("Bulk insert of "+bulkWriteResult.getInsertedCount()+" documents completed in "+ Duration.between(start, Instant.now()).toMillis() + " milliseconds");
return bulkWriteResult.getInsertedCount();
}
}
// end-productrepo
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@

# start-mongoconfig-properties
mongodb.database=bulk
mongodb.uri=<connection string>
documentCount=25000
# end-mongoconfig-properties
76 changes: 76 additions & 0 deletions source/includes/integrations/spring-data-tutorial-code/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.5</version>
<relativePath/> <!-- Lookup parent from repository -->
</parent>
<groupId>com.mongodb.examples</groupId>
<artifactId>SpringDataBulkInsert</artifactId>
<name>SpringDataBulkInsert</name>
<description>SpringDataBulkInsert</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<!-- Spring Boot Web Starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!-- Spring Data MongoDB -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

<!-- Lombok (optional, for annotations like @Getter/@Setter) -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>

<!-- Testing -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>

<dependency>
<groupId>net.datafaker</groupId>
<artifactId>datafaker</artifactId>
<version>2.4.3</version>
</dependency>

<!-- Security (optional) -->
<dependency>
<groupId>io.github.hakky54</groupId>
<artifactId>sslcontext-kickstart</artifactId>
<version>8.3.7</version>
</dependency>

</dependencies>

<build>
<plugins>
<!-- Spring Boot Maven Plugin -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

</project>
4 changes: 4 additions & 0 deletions source/integrations.txt
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,10 @@ Third-Party Integrations
:depth: 2
:class: singlecol

.. toctree::

Tutorial: Spring Data Framework </integrations/spring-data-integration>

Overview
--------

Expand Down
Loading
Loading