web-dev-qa-db-fra.com

comment appeler l'opération de comptage après recherche avec mongodb Java

J'utilise MongoDB 3.0. supposons qu'il existe un ensemble de documents nommé photos, sa structure est

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

avec database.getCollection("photos"), Mongodb renverra un objet MongoCollection, sur lequel j'ai la méthode count() pour obtenir le nombre de documents retournés.

Cependant, lorsque je fais des requêtes avec des conditions spécifiques. Par exemple, recherchez des documents dont l'ID est inférieur à 100:

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

Au-dessus de la méthode find retournera toujours un curseur qui ne fournit pas de fonction count(). Alors, comment puis-je savoir combien de documents sont retournés? Je sais en ligne de commande, je peux utiliser

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

Bien sûr, je peux passer par l'itérateur et compter le nombre de documents moi-même. Cependant je trouve ça vraiment maladroit. Je me demande si MongoDB Java fournit une telle fonctionnalité pour compter le nombre de documents retournés par la méthode find()? Sinon, quelle est la raison de la décision?

16
Ensom Hodder

Comme vous l'avez dit, MongoCollection a la méthode count() qui retournera le nombre de documents dans la collection, mais elle a aussi une count(Bson filter) qui retournera le nombre de documents dans la collection selon les options données .

Vous pouvez donc simplement utiliser:

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

ou peut-être plus clair:

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

réf: http://api.mongodb.com/Java/3.3/com/mongodb/client/MongoCollection.html#count-org.bson.conversions.Bson-

11
Enrichman

J'avais un problème similaire. J'utilise MongoCollection au lieu de DBCollection, car c'est ce qu'il est utilisé dans le guide MongoDG 3.2. MongoCollection n'a pas de méthode count (), donc je pense que la seule option est d'utiliser l'itérateur pour les compter.

Dans mon cas, je n'avais besoin que de savoir si un document avait été retourné, j'utilise ceci:

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

dans la méthode (A) (A est un type de collection) itère sur tous les documents et les ajoute à la cible donnée. Ensuite, nous pouvons obtenir le nombre de documents retournés.

5
Sandeep sandy

Dans MongoDB 3.4, vous ne pouvez utiliser l'itérateur de FindIterable que pour obtenir le nombre de documents renvoyés par un filtre. par exemple.

`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);

"

5
NOTiFY

Les documents de l'API indiquent clairement que l'objet DBCursor fournit une méthode de comptage :

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
Markus W Mahlberg