Skip to content

Instantly share code, notes, and snippets.

@timjonesdev
timjonesdev / MongoDockerfile
Last active November 28, 2019 16:43
A MongoDB Dockerfile which enables a single-node replicaset
FROM mongo:4.0
# files used to initialize the database
COPY ./init-db.d/ /docker-entrypoint-initdb.d
# add this command to a js file in the init directory
# formatted on newlines for better readability
RUN echo "rs.initiate(
{
_id: 'rs0',
@timjonesdev
timjonesdev / mongo_changestream_error.sh
Created August 16, 2019 04:25
The error encountered when trying to watch a Change Stream on a MongoDB instance that is not part of a replica set.
com.mongodb.MongoCommandException:
Command failed with error 40573 (Location40573):
'The $changeStream stage is only supported on replica sets' on server localhost:27017.
The full response is:
{
"ok" : 0.0,
"errmsg" : "The $changeStream stage is only supported on replica sets",
"code" : 40573,
"codeName" : "Location40573"
}
@timjonesdev
timjonesdev / Dockerfile
Created August 16, 2019 17:27
Mongo Seed Data Example with Docker and Docker Compose
FROM mongo:4.0
COPY init.js /init.js
@timjonesdev
timjonesdev / Makefile
Last active August 16, 2019 17:51
A one-command start for MongoDB
# this assumes that your docker-compose.yml file is located in ./docker
up-db-local: rebuild-mongo
pushd docker &&\
docker-compose up -d mongo &&\
popd
rebuild-mongo:
pushd docker &&\
docker-compose build mongo-seed &&\
docker-compose up mongo-seed &&\
@timjonesdev
timjonesdev / Player.java
Last active August 20, 2019 21:53
Player Model for Reactive Mongo Example
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.mongodb.core.mapping.Document;
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@timjonesdev
timjonesdev / Team.java
Created August 20, 2019 21:54
Team model for Reactive Mongo Example
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.bson.types.ObjectId;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;
import java.util.ArrayList;
@timjonesdev
timjonesdev / initial_data.js
Created August 20, 2019 21:55
Initial Data Model for Reactive Mongo Example
db.teams.insert(
[
{
"_id": ObjectId("5d0c18c190d2b33ae629aaa7"),
"name": "HingleMcCringleberry",
"players": [
{"name": "Nick Chubb", "score": 0},
{"name": "James Conner", "score": 0},
{"name": "Julio Jones", "score": 0},
{"name": "Michael Thomas", "score": 0}
@timjonesdev
timjonesdev / TeamRepository.java
Created August 20, 2019 22:07
Team Reactive Mongo Repository for Reactive Mongo Example
import dev.timjones.reactive.data.model.Team;
import org.bson.types.ObjectId;
import org.springframework.data.mongodb.repository.Query;
import org.springframework.data.mongodb.repository.ReactiveMongoRepository;
import reactor.core.publisher.Mono;
public interface TeamRepository extends ReactiveMongoRepository<Team, ObjectId> {
@Query(value = "{ 'players.name' : ?0 }")
Mono<Team> findDistinctByPlayerName(String playerName);
@timjonesdev
timjonesdev / ReactiveMongoConfig.java
Created August 20, 2019 22:31
Extend the AbstractReactiveMongoConfiguration
import com.mongodb.reactivestreams.client.MongoClient;
import com.mongodb.reactivestreams.client.MongoClients;
import org.springframework.context.annotation.Bean;
import org.springframework.data.mongodb.config.AbstractReactiveMongoConfiguration;
import org.springframework.data.mongodb.core.ReactiveMongoTemplate;
import org.springframework.data.mongodb.repository.config.EnableReactiveMongoRepositories;
/**
* Config class to set up necessary components for watching the MongoDB change stream
*/
@timjonesdev
timjonesdev / TeamChangeWatch.java
Created August 20, 2019 22:47
The main implementation for watching changes on a MongoDB Collection
/**
* Watch for changes to the teams collection
*
* @return a subscription to the change stream
*/
public Flux<Team> watchForTeamCollectionChanges() {
// set changestream options to watch for any changes to the businesses collection
ChangeStreamOptions options = ChangeStreamOptions.builder()
.filter(Aggregation.newAggregation(Team.class,
Aggregation.match(