MongoDB Java: finding objects in Mongo using QueryBuilder $ in a statement returns nothing

I have a JUnit rule called MongoRule looks like

 public class MongoRule extends ExternalResource { private static final Logger LOGGER = LoggerFactory.getLogger(MongoRule.class); private final MongoService mongoService; public MongoRule() throws UnknownHostException { mongoService = new MongoService(getConfiguredHost(), getConfiguredPort(), getConfiguredDatabase()); } @Override protected void before() throws Throwable { LOGGER.info(" Setting up Mongo Database - " + getConfiguredDatabase()); } @Override protected void after() { LOGGER.info("Shutting down the Mongo Database - " + getConfiguredDatabase()); mongoService.getMongo().dropDatabase(getConfiguredDatabase()); } @Nonnull public DB getDatabase() { return mongoService.getMongo().getDB(getConfiguredDatabase()); } @Nonnull public Mongo getMongo() { return mongoService.getMongo(); } @Nonnull public MongoService getMongoService() { return mongoService; } public static int getConfiguredPort() { return Integer.parseInt(System.getProperty("com.db.port", "27017")); } @Nonnull public static String getConfiguredDatabase() { return System.getProperty("com.db.database", "database"); } @Nonnull public static String getConfiguredHost() { return System.getProperty("com.db.host", "127.0.0.1"); } } 

Then I try to insert some documents in line with

  public static void saveInDatabase() { LOGGER.info("preparing database - saving some documents"); mongoRule.getMongoService().putDocument(document1); mongoRule.getMongoService().putDocument(document2); } 

If document1 and document2 are valid DBObject documents. The circuit looks like

 { Id: 001 date_created: 2012-10-31 vars: { '1': { name: n1 value:v1 } '2': { name: n2 value:v2 } '3': { name: n3 value:v3 } } { Id: 002 date_created: 2012-10-30 vars: { '1': { name: n4 value:v4 } '2': { name: n5 value:v5 } '3': { name: n6 value:v6 } } 

Now I am trying to query the collection and get these objects, so I am doing this

 public static void getDocuments(List<String> documentIds) { BasicDBList docIds = new BasicDBList(); for (String docId: documentIds) { docIds.add(new BasicDBObject().put("Id", docId)); } DBObject query = new BasicDBObject(); query.put("$in", docIds); DBCursor dbCursor = mongoRule.getDatabase().getCollection("mycollection").find(query); System.out.println(dbCursor == null); if (dbCursor != null) { while (dbCursor.hasNext()) { System.out.println("object - " + dbCursor.next()); } } } 

mycollection is a collection in which all documents are saved, this comes from an external service.
When I run this document, I see the following

 preparing database - saving some documents inserting document - DBProposal # document1 inserting document - DBProposal # document2 false 

This means that collection.find() could not find these documents.

What am I not doing here? How can I return the documents?

I am very new to using Java with Mongo and used this link to build the query

UPDATE
After changing the method of building the request, I still do not see the documents

 public static void getDocuments(List<String> documentIds) { BasicDBList docIds = new BasicDBList(); docIds.addAll(documentIds) DBObject query = new BasicDBObject(); query.put("$in", docIds); DBCursor dbCursor = mongoRule.getDatabase().getCollection("mycollection").find(query); System.out.println(dbCursor == null); if (dbCursor != null) { while (dbCursor.hasNext()) { System.out.println("object - " + dbCursor.next()); } } } 

and the collection name is returned through

 private static String getCollectionName(@Nonnull final DBObject dbObject) { return "mycollection"; } 
+3
source share
1 answer

Now you are running the equivalent:

 db.col.find({$in:[{Id:id1}, {Id:id2}, ..., {Id:idN}]}) 

What an invalid request, since you did not indicate in which field $ is worth. I assume you want:

 db.col.find({Id:{$in:[id1, id2, ..., idN]}}) 

Change your building request code and everything will be fine.

EDIT: adding the correct code:

 public static void getDocuments(List<Integer> documentIds) { BasicDBList docIds = new BasicDBList(); docIds.addAll(documentIds) DBObject inClause = new BasicDBObject("$in", docIds); DBObject query = new BasicDBObject("Id", inClause); DBCursor dbCursor = mongoRule.getDatabase().getCollection("mycollection").find(query); System.out.println(dbCursor == null); if (dbCursor != null) { while (dbCursor.hasNext()) { System.out.println("object - " + dbCursor.next()); } } } 

Please note that this means that "Id" is something other than "_id"

+8
source

Source: https://habr.com/ru/post/978215/


All Articles