MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

mongodb mongoTemplate получава отделно поле с някои критерии

От една страна .getCollection() метод връща основния обект за събиране на драйвери по следния начин:

DBCollection collection = mongoTemplate.getCollection("collectionName");

Така че типът обект на заявка може да е различен от това, което използвате, но има и някои други неща. А именно това .distinct() връща само "различните" стойности на ключа, който сте поискали, и не връща други полета на документа. Така че можете да направите:

Criteria criteria = new Criteria();
criteria.where("dataset").is("d1");
Query query = new Query();
query.addCriteria(criteria);
List list = mongoTemplate.getCollection("collectionName")
    .distinct("source",query.getQueryObject());

Но това ще върне само "проба" като единичен елемент в списъка например.

Ако искате „полетата“ от отделен набор, използвайте .aggregate() метод вместо това. С „първото“ появяване на стойностите на другите полета за отделния ключ:

    DBCollection colllection = mongoTemplate.getCollection("collectionName");

    List<DBObject> pipeline = Arrays.<DBObject>asList(
        new BasicDBObject("$match",new BasicDBObject("dataset","d1")),
        new BasicDBObject("$group",
            new BasicDBObject("_id","$source")
                .append("name",new BasicDBObject("$first","$name"))
                .append("description", new BasicDBObject("$first","$description"))
        )
    );

    AggregationOutput output = colllection.aggregate(pipeline);

Или действителните „отделни“ стойности на множество полета, като ги направите част от ключа за групиране:

    DBCollection colllection = mongoTemplate.getCollection("collectionName");

    List<DBObject> pipeline = Arrays.<DBObject>asList(
        new BasicDBObject("$match",new BasicDBObject("dataset","d1")),
        new BasicDBObject("$group",
            new BasicDBObject("_id",
                new BasicDBObject("source","$source")
                    .append("name","$name")
                    .append("description","$description")
            )
        )
    );

    AggregationOutput output = colllection.aggregate(pipeline);

Има и директен .aggregate() метод на екземпляри на mongoTemplate вече, който има редица помощни методи за изграждане на тръбопроводи. Но това поне трябва да ви насочи в правилната посока.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Защо производителността на Mongodb е по-добра на Linux, отколкото на Windows?

  2. Mongo DB ISO формат

  3. Заявка за списък, съдържащ се в друг списък в mongodb

  4. преименуване на колекция с mongoDB

  5. Как да извършите търсене със заместващи символи в MongoDB с помощта на Java