0

I am using spring-sata-mongodb 1.8.2 with MongoRepository and I am trying to use the mongo $slice option to limit a list size when query, but I can't find this option in the mongorepository.

my classes look like this:

public class InnerField{
    public String a;
    public String b;
    public int n;
}

@Document(collection="Record")
punlic class Record{
    public ObjectId id;
    public List<InnerField> fields;
    public int numer;
}

As you can see I have one collection name "Record" and the document contains the InnerField. the InnerField list is growing all the time so i want to limit the number of the selected fields when I am querying.

I saw that: https://docs.mongodb.org/v3.0/tutorial/project-fields-from-query-results/

which is exactly what I need but I couldn't find the relevant reference in mongorepository.

Any ideas?

marc_s
  • 732,580
  • 175
  • 1,330
  • 1,459
Gal Rotem
  • 9
  • 2
  • 7

3 Answers3

1

Providing an abstraction for the $slice operator in Query is still an open issue. Please vote for DATAMONGO-1230 and help us prioritize.

For now you still can fall back to using BasicQuery.

String qry = "{ \"_id\" : \"record-id\"}";
String fields = "{\"fields\": { \"$slice\": 2} }";

BasicQuery query = new BasicQuery(qry, fields);
Christoph Strobl
  • 6,491
  • 25
  • 33
1

Use slice functionality as provided in Java Mongo driver using projection as in below code.

For Example:

List<Entity> list = new ArrayList<Entity>();
        // Return the last 10 weeks data only
FindIterable<Document> list = db.getDBCollection("COLLECTION").find()
                .projection(Projections.fields(Projections.slice("count", -10)));
MongoCursor<Document> doc = list.iterator();
while(doc.hasNext()){
    list.add(new Gson().fromJson(doc.next().toJson(), Entity.class));
}

The above query will fetch all documents of type Entity class and the "field" list of each Entity class document will have only last 10 records.

Arijeet Saha
  • 1,118
  • 11
  • 23
0

I found in unit test file (DATAMONGO-1457) way to use slice. Some thing like this.

newAggregation(
    UserWithLikes.class, 
    match(new Criteria()),
    project().and("likes").slice(2)
);
Long Nguyen
  • 9,898
  • 5
  • 53
  • 52