Vaibhav
Vaibhav

Reputation: 2143

$elemMatch equivalent in spring data mongodb

I need to know the equivalent code in spring data mongo db to the code below:-

db.inventory.find( {
                     qty: { $all: [
                                    { "$elemMatch" : { size: "M", num: { $gt: 50} } },
                                    { "$elemMatch" : { num : 100, color: "green" } }
                                  ] }
                   } )

Upvotes: 14

Views: 24229

Answers (5)

kopeclu2
kopeclu2

Reputation: 1

Hi i implemented too in Kotlin, its is extended about if statements to create dynamic query :)

val map = segmentFilter.segmentValueMap.map {
            val segmentCriteria = where("segment").isEqualTo(it.key)
            if (it.value.isNotEmpty()) {
                segmentCriteria.and("segmentValue").`in`(it.value)
            }
            if (sovOverviewInDateRange != null) {
                segmentCriteria.and("date").lte(sovOverviewInDateRange.recent).gte(sovOverviewInDateRange.older)
            }
            Criteria().elemMatch(segmentCriteria)
        }
        criteriaQuery.and("sovOverview").all(map.map { it.criteriaObject })

  sovOverviews: {
      $all: [
        {
         $elemMatch: {
        segment: "Velikost",
        segmentValue: "S"
         }
      },
      {
         $elemMatch: {
        segment: "Kategorie"
         }
      }
        ]
      }

Upvotes: 0

DCO
DCO

Reputation: 1292

Just to make @Vaibhav answer a bit more clearer.

given Document in DB

{
   "modified": true,
   "items": [
     {
      "modified": true,
      "created": false
     },
     {
      "modified": false,
      "created": false
     },
     {
      "modified": true,
      "created": true
     }
   ]
}

You could do following Query if you need items where both attribute of an item are true.

 Query query = new Query();
    query.addCriteria(Criteria.where("modified").is(true));
    query.addCriteria(Criteria.where("items")
            .elemMatch(Criteria.where("modified").is(true)
                    .and("created").is(true)));

here an example how to query with OR in elemMatch

 Query query = new Query();
        query.addCriteria(Criteria.where("modified").is(true));
        query.addCriteria(Criteria.where("items")
                .elemMatch(new Criteria().orOperator(
                        Criteria.where("modified").is(true), 
                        Criteria.where("created").is(true))));

Upvotes: 1

svichkar
svichkar

Reputation: 1856

Just implemented $all with $elemMatch with spring data Criteria API:

var elemMatch1 = new Criteria()
.elemMatch(Criteria.where("size").is("M").and("num").gt(50));
var elemMatch2 = new Criteria()
.elemMatch(Criteria.where("num").is(100).and("color").is("green"));

var criteria = Criteria.where("qty")
.all(elemMatch1.getCriteriaObject(), elemMatch2.getCriteriaObject());

mongoTemplate.find(Query.query(criteria), Inventory.class);

Note: important part is calling getCriteriaObject method inside Criteria.all(...) for each Criteria.elemMatch(...) element.

Upvotes: 1

Chamly Idunil
Chamly Idunil

Reputation: 1872

I think query in your answer generated below query

{ "qty" : { "$elemMatch" : { "num" : 100 , "color" : "green"}}}

I think thats not you need.

Its only check last elemMatch expression not all.

Try with this.

query = new Query();
Criteria first = Criteria.where("qty").elemMatch(Criteria.where("size").is("M").and("num").gt(50));
Criteria two = Criteria.where("qty").elemMatch(Criteria.where("num").is(100).and("color").is("green"));
query.addCriteria(new Criteria().andOperator(first, two));

Upvotes: 4

Vaibhav
Vaibhav

Reputation: 2143

I am able to get the answer. This can be done in Spring data mongodb using following code

Query query = new Query();      
query.addCriteria(Criteria.where("qty").elemMatch(Criteria.where("size").is("M").and("num").gt(50).elemMatch(Criteria.where("num").is(100).and("color").is("green"))));

Upvotes: 34

Related Questions