2015-09-20 11 views
9

Sto usando MongoDB 3.0. supponiamo che ci sia un insieme di documenti denominati photos, la sua struttura ècome chiamare l'operazione di conteggio dopo aver trovato con il driver java mongodb

{"_id" : 1, photographer: "jack"} 

con database.getCollection("photos"), MongoDB restituisce un oggetto MongoCollection, su cui ho il metodo count() per ottenere i documenti numero restituito.

Tuttavia, quando faccio domande con condizioni specifiche. Per esempio trovare documenti con ID minore di 100:

photosCollections.find(Document.parse("{_id : {$lt : 100}}")) 

Sopra find metodo restituirà sempre un cursore che non prevede una funzione count(). Quindi, come posso sapere quanti documenti sono stati restituiti? So che in linea di comando, posso usare

db.photos.find({_id : {$lt : 100}}).count() 

Naturalmente, posso passare attraverso l'iteratore e contare il numero di documenti me stesso. Comunque lo trovo davvero maldestro. Mi chiedo se il driver java MongoDB fornisca tale funzionalità per contare il numero di documenti restituiti dal metodo find()? In caso negativo, qual è la ragione alla base della decisione?

risposta

1

La documentazione API indicare chiaramente che DBCursor Object provides a count method:

MongoClient client = new MongoClient(MONGOHOST,MONGOPORT); 
DBCollection coll = client.getDB(DBNAME).getCollection(COLLECTION); 

DBObject query = new Querybuilder().start() 
        .put("_id").lessThan(100).get(); 

DBCursor result = coll.find(query); 

System.out.println("Number of pictures found: " + result.count()); 
+0

Sì, il metodo count() è stato fornito in MongoDB 2.0, ma è stata rimossa in MongoDB 3.0. Non so quale sia la ragione ...... –

+0

@EnsomHodder http://mongodb.github.io/mongo-java-driver/3.0/driver/getting-started/quick-tour/ Si noti la 3.0 nell'URL . Testato, funziona. –

+0

Il Querybuilder non esiste – PedroD

3

Ho avuto un problema simile. Sto usando MongoCollection invece di DBCollection, poiché è ciò che viene utilizzato nella guida di MongoDG 3.2. MongoCollection non ha il metodo count(), quindi penso che l'unica opzione è usare l'iteratore per contarli.

Nel mio caso ho solo bisogno di sapere se un documento è stato restituito, io sto usando questo:

if(result.first() != null) 
1
Bson bson = Filters.eq("type", "work"); 
List<Document> list = collection.find(bson).into(new ArrayList<>()); 
System.out.println(list.size()); 

in (A) (A è raccolta tipo) Metodo itera su tutti i documenti e aggiunge ciascuno al dato bersaglio. Quindi possiamo ottenere il conteggio dei documenti restituiti.

6

Come ha detto il MongoCollection ha il metodo count() che restituirà il numero di documenti della collezione, ma ha anche una count(Bson filter) che restituirà il numero di documenti nella raccolta in base alle opzioni date.

Così si può semplicemente utilizzare:

long count = photosCollections.count(Document.parse("{_id : {$lt : 100}}")) 

o forse più chiaro:

Document query = new Document("_id", new Document("$lt", 100)); 
long count = photosCollections.count(query); 

ref: http://api.mongodb.com/java/3.3/com/mongodb/client/MongoCollection.html#count-org.bson.conversions.Bson-

1

In MongoDB 3.4 è possibile utilizzare solo l'Iterator di FindIterable per ottenere il conteggio dei documenti restituiti da un filtro. per esempio.

`FindIterable findIterable = 
mongoCollection.find(Filters.eq("EVENT_TYPE", "Sport")); 
    Iterator iterator = findIterable.iterator(); 
    int count = 0; 
    while (iterator.hasNext()) { 
     iterator.next(); 
     count++; 
    } 
    System.out.println(">>>>> count = " + count); 

`