Cannot iterate through MongoDB Collection - java

As a step towards familiarising myself with MongoDB, I started to create simple Java Classes to perform CRUD in MongoDB. I was able to establish connection with MongoDB. Nevertheless, when I try to iterate through the MongoDB collection, I'm getting errors. Implemented Java class is shared here.
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import java.util.Iterator;
import org.bson.Document;
public class ReadMongo {
public static void main( String args[] ) {
//Creating a MongoDB client
com.mongodb.client.MongoClient mongo = MongoClients.create("mongodb://localhost:27017");
//Connecting to the database
MongoDatabase database = mongo.getDatabase("myDB");
//Creating a collection object
MongoCollection<Document> collection = database.getCollection("myGrid");
//Retrieving the documents
FindIterable<Document> iterDoc = collection.find();
Iterator it = iterDoc.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
Below I've shared the error log.
INFO: Cluster created with settings {hosts=[localhost:27017], mode=SINGLE, requiredClusterType=UNKNOWN, serverSelectionTimeout='30000 ms', maxWaitQueueSize=500}
Exception in thread "main" java.lang.NoSuchMethodError: com.mongodb.internal.operation.SyncOperations.<init>(Lcom/mongodb/MongoNamespace;Ljava/lang/Class;Lcom/mongodb/ReadPreference;Lorg/bson/codecs/configuration/CodecRegistry;Lcom/mongodb/WriteConcern;Z)V
at com.mongodb.client.internal.MongoCollectionImpl.<init>(MongoCollectionImpl.java:106)
at com.mongodb.client.internal.MongoDatabaseImpl.getCollection(MongoDatabaseImpl.java:132)
at com.mongodb.client.internal.MongoDatabaseImpl.getCollection(MongoDatabaseImpl.java:127)
at ReadMongo.main(ReadMongo.java:14)
The line #14 corresponds to MongoCollection<Document> collection = database.getCollection("myGrid"); line.

I still don't know what's wrong with the above code. Nevertheless, I was able to solve this issue following these resources: (i) resource 1 and (ii) resource 2. The final working solutions is as follows.
import com.mongodb.MongoClient;
import com.mongodb.MongoClientURI;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;
public class MongoDB {
public static MongoClient mongoClient;
public static MongoDatabase database;
public static void main(String[] args) {
mongoClient = new MongoClient(new MongoClientURI("mongodb://localhost:27017"));
database = mongoClient.getDatabase("myDB");
FindIterable<Document> mydatabaserecords = database.getCollection("myGrid").find();
MongoCursor<Document> iterator = mydatabaserecords.iterator();
while (iterator.hasNext()) {
Document doc = iterator.next();
System.out.println(iterator.next());
}
}
}

Related

How do I iterate over a MongoDB Change Stream in Spring Boot?

I have read countless of articles and code examples on MongoDB Change Streams, but I still can't manage to set it up properly. I'm trying to listen to a specific collection in my MongoDB and whenever a document is inserted, updated or deleted, I want to do something.
This is what I've tried:
#Data
#Document(collection = "teams")
public class Teams{
private #MongoId(FieldType.OBJECT_ID)
ObjectId id;
private Integer teamId;
private String name;
private String description;
}
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.client.model.Aggregates;
import com.mongodb.client.model.Filters;
import com.mongodb.client.model.changestream.FullDocument;
import com.mongodb.client.ChangeStreamIterable;
import org.bson.Document;
import org.bson.conversions.Bson;
import java.util.Arrays;
import java.util.List;
public class MongoDBChangeStream {
// connect to the local database server
MongoClient mongoClient = MongoClients.create("db uri goes here");
// Select the MongoDB database
MongoDatabase database = mongoClient.getDatabase("MyDatabase");
// Select the collection to query
MongoCollection<Document> collection = database.getCollection("teams");
// Create pipeline for operationType filter
List<Bson> pipeline = Arrays.asList(
Aggregates.match(
Filters.in("operationType",
Arrays.asList("insert", "update", "delete"))));
// Create the Change Stream
ChangeStreamIterable<Document> changeStream = collection.watch(pipeline)
.fullDocument(FullDocument.UPDATE_LOOKUP);
// Iterate over the Change Stream
for (Document changeEvent : changeStream) {
// Process the change event here
}
}
So this is what I have so far and everything is good until the for-loop which gives three errors:
There is a red line under 'for (', which says unexpected token.
There is a red line under ' :', which says ';' expected.
There is a red line under 'changeStream)', which says unknown class: 'changeStream'.
First of all you should put your code inside class method, not class body. Second - ChangeStreamIterable<Document> iterator element is ChangeStreamDocument<Document> and not Document.
Summing things up:
public class MongoDBChangeStream {
public void someMethod() {
// connect to the local database server
MongoClient mongoClient = MongoClients.create("db uri goes here");
// Select the MongoDB database
MongoDatabase database = mongoClient.getDatabase("MyDatabase");
// Select the collection to query
MongoCollection<Document> collection = database.getCollection("teams");
// Create pipeline for operationType filter
List<Bson> pipeline = Arrays.asList(
Aggregates.match(
Filters.in(
"operationType",
Arrays.asList("insert", "update", "delete")
)));
// Create the Change Stream
ChangeStreamIterable<Document> changeStream = collection.watch(pipeline)
.fullDocument(FullDocument.UPDATE_LOOKUP);
// Iterate over the Change Stream
for (ChangeStreamDocument<Document> changeEvent : changeStream) {
// Process the change event here
}
}
}

How to Connect MongoDB with Java Program

I want to connect My Java Program with Mongo DB database. Below I have written my Java Program.But It's giving some Error.
import java.net.UnknownHostException;
import com.mongodb.BasicDBObjectBuilder;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.MongoClient;
import com.mongodb.WriteResult;
import org.bson.*;
public class JavaMongo{
public static void main(String[] args)
{
try
{
MongoClient mongoClient = new MongoClient("localhost", 27017);
MongoDatabase database = mongoClient.getDatabase("mydb");
for (String name : database.listCollectionNames()) {
System.out.println(name);
}
mongoClient.close();
}
catch(Exception e)
{
System.out.println(e);
}
}
}
I have following error
Errors on my terminal.
You had Miss the Creating Credentials statement . So Basically this Error Showing try this code.
import java.net.UnknownHostException;
import com.mongodb.BasicDBObjectBuilder;
import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;
import com.mongodb.MongoClient;
import com.mongodb.WriteResult;
import com.mongodb.MongoCredential;
import com.mongodb.client.MongoDatabase;
import org.bson.*;
public class JavaMongo{
public static void main(String[] args)
{
try
{
MongoClient mongoClient = new MongoClient("localhost", 27017);
// Creating Credentials
MongoCredential credential;
credential = MongoCredential.createCredential("sampleUser", "myDb",
"password".toCharArray());
MongoDatabase database = mongoClient.getDatabase("mydb");
for (String name : database.listCollectionNames()) {
System.out.println(name);
}
mongoClient.close();
}
catch(Exception e)
{
System.out.println(e);
}
}
}
You need to import "com.mongodb.client.MongoDatabase" for using MongoDatabase Interface.
maven dependency:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
===========================================================================
application.properties
server.port = 8080
spring.data.mongodb.database=user_db
spring.data.mongodb.port=27017
spring.data.mongodb.host=localhost
===========================================================================
for reference use below link:(step by step explanation)
https://www.youtube.com/watch?v=2Tq2Q7EzhSA&t=7s

Why eq doesn't exist for mongo-java-driver?

I've found in mongodb tutorial for java about how to query from mongo collection but the eq which they use doesn't work for me! Do you know how to filter documents from a collection with mongo and java?
This is my try:
package Database;
import org.bson.Document;
import com.mongodb.MongoClient;
import com.mongodb.MongoClientURI;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
public class StackOverflow {
public static void main(String[] args) {
// insert something to mongo:
final String URI = "mongodb://localhost:27017";
final String DB = "StackOverflowQuestion";
final String COLLECTION = "eqDoesntExcist";
MongoClientURI connection = new MongoClientURI(URI);
MongoClient mongo = new MongoClient(connection);
MongoDatabase database = mongo.getDatabase(DB);
MongoCollection<Document> collection = database.getCollection(COLLECTION);
Document doc = new Document("name", "Troy").append("height", 185);
collection.insertOne(doc);
doc = new Document("name", "Ann").append("height", 175);
collection.insertOne(doc);
// read something from mongo
FindIterable<Document> findIt = collection.find(eq("name", "Troy"));
// ERROR!!! the method eq(String, String) is undefined!
mongo.close();
}
}
I want something like:
SELECT * from eqDoesntExcist WHERE name = "Troy"
You can use an eq Filter there as:
Bson bsonFilter = Filters.eq("name", "Troy");
FindIterable<Document> findIt = collection.find(bsonFilter);
or else to make it look the way doc suggests include a static import for the method call Filters.eq
import static com.mongodb.client.model.Filters.eq;
and further use the same piece of code as yours :
FindIterable<Document> findIt = collection.find(eq("name", "Troy")); // static import is the key to such syntax
you can not do this:
collection.find(eq("name", "Troy"));
because the compiler will expect in your class StackOverflow a method with the name eq and this is not what you need..
what you are looking for is defined in the Filter class
public static <TItem> Bson eq(String fieldName, Item value)
so it may be
collection.find(Filters.eq("name", "Troy"));

java code gives error in mongodb while compiling

I am new to mongodb and i have the following code
import com.mongodb.*;
import com.mongodb.Block;
import com.mongodb.client.AggregateIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;
import org.bson.types.ObjectId;
import static java.util.Arrays.asList;
public class getAssets{
public static void main( String args[] ){
Block<Document> printBlock = new Block<Document>() {
#Override
public void apply(final Document document) {
System.out.println(document.toJson());
}
};
MongoClient mongoClient = new MongoClient("localhost",27017);
MongoDatabase database = mongoClient.getDatabase("test");
System.out.println("Connect to database successfully");
MongoCollection<Document> coll = database.getCollection("asset");
BasicDBList statusList = new BasicDBList();
statusList.add("1");
statusList.add("2");
statusList.add("3");
DBObject statusInClause = new BasicDBObject("$in", statusList);
BasicDBList idList = new BasicDBList();
idList.add("123");
DBObject siteIdInClause = new BasicDBObject("$in", idList);
DBObject fields = new BasicDBObject("asset.status", statusInClause);
fields.put("asset.siteid", siteIdInClause);
DBObject unwind = new BasicDBObject("$unwind", "$asset");
DBObject match = new BasicDBObject("$match", fields);
AggregateIterable<Document> aggr = coll.aggregate(asList(unwind, match));
aggr.forEach(printBlock);
mongoClient.close();
}
}
And i am getting the following error while compling
C:\MongoDB\java>javac -cp .;mongo-java-driver-3.4.1.jar getAssets.java
getAssets.java:46: error: no suitable method found for aggregate(List<DBObject>)
AggregateIterable<Document> aggr = coll.aggregate(asList(unwind, match));
^
method MongoCollection.<TResult>aggregate(List<? extends Bson>,Class<TResult>) is not applicable
(cannot instantiate from arguments because actual and formal argument lists differ in length)
method MongoCollection.aggregate(List<? extends Bson>) is not applicable
(actual argument List<DBObject> cannot be converted to List<? extends Bson> by method invocation conversion)
where TResult is a type-variable:
TResult extends Object declared in method <TResult>aggregate(List<? extends Bson>,Class<TResult>)
1 error
Note : Using mongo 3.4.1
New Code :
import com.mongodb.*;
import com.mongodb.Block;
import com.mongodb.client.AggregateIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;
import org.bson.types.ObjectId;
import static java.util.Arrays;
import static java.util.Arrays.asList;
public class getAssets{
public static void main( String args[] ){
Block<Document> printBlock = new Block<Document>() {
#Override
public void apply(final Document document) {
System.out.println(document.toJson());
}
};
MongoClient mongoClient = new MongoClient("localhost",27017);
MongoDatabase database = mongoClient.getDatabase("test");
System.out.println("Connect to database successfully");
MongoCollection<Document> coll = database.getCollection("asset");
Document unwind = new Document("$unwind", "$dp.asset");
Document match = new Document("$match", new Document("$dp.asset.status", new Document("$in", new String[]{"ACTIVE", "LIMITEDUSE", "OPERATING"})).
append("$dp.asset.siteid", new Document("$in", new String[]{"BEDFORD"})));
AggregateIterable<Document> aggr = coll.aggregate(Arrays.asList(unwind, match));
aggr.forEach(printBlock);
mongoClient.close();
}
}
Compiles with no error but runtime error
Exception in thread "main" java.lang.NoSuchMethodError: org.bson.BsonDocument.clone()Lorg/bson/BsonDocument;
at com.mongodb.connection.ClientMetadataHelper.createClientMetadataDocument(ClientMetadataHelper.java:146)
at com.mongodb.connection.ClientMetadataHelper.createClientMetadataDocument(ClientMetadataHelper.java:136)
at com.mongodb.connection.InternalStreamConnectionFactory.<init>(InternalStreamConnectionFactory.java:41)
at com.mongodb.connection.DefaultClusterableServerFactory.create(DefaultClusterableServerFactory.java:68)
at com.mongodb.connection.BaseCluster.createServer(BaseCluster.java:360)
at com.mongodb.connection.SingleServerCluster.<init>(SingleServerCluster.java:54)
at com.mongodb.connection.DefaultClusterFactory.create(DefaultClusterFactory.java:114)
at com.mongodb.Mongo.createCluster(Mongo.java:744)
at com.mongodb.Mongo.createCluster(Mongo.java:728)
at com.mongodb.Mongo.<init>(Mongo.java:293)
at com.mongodb.Mongo.<init>(Mongo.java:288)
at com.mongodb.Mongo.<init>(Mongo.java:284)
at com.mongodb.MongoClient.<init>(MongoClient.java:179)
at com.mongodb.MongoClient.<init>(MongoClient.java:156)
at com.mongodb.MongoClient.<init>(MongoClient.java:146)
at getAssets.main(getAssets.java:20)
For me , I resolved this error by using mongodb driver 3.6.4
Add this in your dependency(gradle for example)
dependencies {
implementation 'org.mongodb:mongodb-driver:3.6.4'
}
I am using IntelliJ IDEA to manage my dependencies and I noticed that I had the MongoDB bson library listed twice in my libraries (once as org.mongo:bson:3.0.0 and also as org.mongo:bson:Latest). I deleted the "Latest" entry and the error went away.

Query Collections containing an ObjectId within an Array in Mongo with Java

in pure Javascript, I can write a query like this:
db.getCollection('someTable').find({
someArray:{$elemMatch:{$eq:ObjectId("SomeObjectId")}}
});
Now I need to write this in Java.
Something like this.collection.find().filter...
But I don't seem to get it right. How's the statement above translated to java?
Thanks
This may be what you looking for:
MongoClient client = new MongoClient("localhost",27017);
MongoDatabase db = client.getDatabase("test");
db.getCollection("someTable").find(new BasicDBObject("someArray", new BasicDBObject("$elemMatch", new BasicDBObject("$eq", new BsonObjectId(new ObjectId("SomeObjectId"))))));
For this you need to use mongo-client for java program.
Here is some snippet from mongo java
import com.mongodb.ErrorCategory;
import com.mongodb.MongoWriteException;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;
import org.bson.conversions.Bson;
import sun.misc.BASE64Encoder;
public class DocumentDAO {
final MongoClient mongoClient = new MongoClient(new MongoClientURI(mongoURIString));
final MongoDatabase mongoDatabase= mongoClient.getDatabase("Db");
public DocumentDAO(final MongoDatabase mongoDatabase) {
someCollection= mongoDatabase.getCollection("SomeCollecton");
}
Bson filter =new Document("objectId",objectName);
List <Document> all= someCollection.find(filter).into( new ArrayList<Document>());
for(Document cur:all)
{
obj=cur;
}}
Maven could be used to download latest mongo driver for java
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver</artifactId>
<version>3.0.0-rc0</version>
</dependency>

Categories

Resources