5

I'm unable to add redact with mongodb template below is my mongo code which is working fine and using sping mongo 1.8.5

  db.abc.aggregate([
 { "$geoNear" : { near : { "type" : "Point", "coordinates" : [ 72.5, 19.8 ] 
 }, distanceField: "dist.calculated", maxDistance: 500000, includeLocs: "dist.location", num: 5, limit: 200, spherical: true } },
{ "$unwind" : "$items" },
{ "$redact" : { 
"$cond" : { 
if : { "$eq" : [ { "$cmp" : [ "$items.address", "$dist.location" ] }, 0 ] },
then : "$$KEEP", 
else : "$$PRUNE"
 } 
} 
}
])

Here is my java code which is not working as above mongo code

 Point point=new Point(longi,lat);
    NearQuery nearQuery = NearQuery.near(point).maxDistance(1000).spherical(true);
  Aggregation agg = Aggregation.newAggregation(Aggregation.geoNear(nearQuery, "calculated"),Aggregation.unwind("items"),
    Aggregation.group("merchantId", "_id", "catalogTypeId", "catalogStatusId", "departmentName",
                        "categoryName", "subCategoryName", "serviceFlag", "date", "availability", "distance",
                        "commissionPercentage", "createdBy", "updatedBy", "departmentId", "categoryId",
                        "subCategoryId", "createdOn", "updatedOn").push("items").as("items"),
                Aggregation.skip(skip), Aggregation.limit(limit)

        );

can anybody help me to find out how to run this query in java

my document structure

{ "_id" : "CAT106679778", "_class" : "com.ikarma.core.catalog.domain.CatalogForAdminAndMerchant", "merchantId" : "M117442443", "catalogTypeId" : "catalogTypeProduct", "catalogStatusId" : "catalogStatusDraft", "items" : [ { "name" : "Jewelry", "description" : "Jewelry", "price" : "1000", "itemStatusId" : "catalogStatusDraft", "itemStatusName" : "Draft", "unitMeasure" : 30, "stock" : NumberInt("12"), "availableStock" : NumberInt("12"), "orderStock" : NumberInt("0"), "photos" : [ "https://clappilystorage.blob.core.windows.net/clappilymerchant/M117442443/MyProduct/GiftsAnniversary GiftsJewelryJewelry/1520415128722cheers.jpg" ], "activeFlag" : "undefined", "tags" : [ "Jewelry", "Jewelry" ], "discount" : "25", "advancePayment" : "10", "unitName" : "Gm", "itemId" : NumberLong("78921671000"), "videos" : [ null, null, null ], "commissionPercentage" : 10, "commissionAmount" : 0, "itemIsDeleted" : "false", "netSellingPrice" : 750, "starCount" : 0, "deliveryCharges" : 0, "customItemCode" : "zdfg", "taxes" : 0, "perishable" : false, "itemsLat" : 21, "itemsLong" : 74, "ratingAvg" : 0, "address" : { "type" : "Point", "coordinates" : [ 74, 21 ] } }, { "name" : "Jewelry", "description" : "Jewelry", "price" : "1000", "itemStatusId" : "catalogStatusDraft", "itemStatusName" : "Draft", "unitMeasure" : 30, "stock" : NumberInt("12"), "availableStock" : NumberInt("12"), "orderStock" : NumberInt("0"), "photos" : [ "https://clappilystorage.blob.core.windows.net/clappilymerchant/M117442443/MyProduct/GiftsAnniversary GiftsJewelryJewelry/1520415128722cheers.jpg" ], "activeFlag" : "undefined", "tags" : [ "Jewelry", "Jewelry" ], "discount" : "25", "advancePayment" : "10", "unitName" : "Gm", "itemId" : NumberLong("1347268704"), "videos" : [ null, null, null ], "commissionPercentage" : 10, "commissionAmount" : 0, "itemIsDeleted" : "false", "netSellingPrice" : 750, "starCount" : 0, "deliveryCharges" : 0, "customItemCode" : "zdfg", "taxes" : 0, "perishable" : false, "itemsLat" : 22, "itemsLong" : 75, "ratingAvg" : 0, "address" : { "type" : "Point", "coordinates" : [ 75, 22 ] } }, { "name" : "Jewelry", "description" : "Jewelry", "price" : "1000", "itemStatusId" : "catalogStatusDraft", "itemStatusName" : "Draft", "unitMeasure" : 30, "stock" : NumberInt("12"), "availableStock" : NumberInt("12"), "orderStock" : NumberInt("0"), "photos" : [ "https://clappilystorage.blob.core.windows.net/clappilymerchant/M117442443/MyProduct/GiftsAnniversary GiftsJewelryJewelry/1520415128722cheers.jpg" ], "activeFlag" : "undefined", "tags" : [ "Jewelry", "Jewelry" ], "discount" : "25", "advancePayment" : "10", "unitName" : "Gm", "itemId" : NumberLong("10043410600"), "videos" : [ null, null, null ], "commissionPercentage" : 10, "commissionAmount" : 0, "itemIsDeleted" : "false", "netSellingPrice" : 750, "starCount" : 0, "deliveryCharges" : 0, "customItemCode" : "zdfg", "taxes" : 0, "perishable" : false, "itemsLat" : 23, "itemsLong" : 76, "ratingAvg" : 0, "address" : { "type" : "Point", "coordinates" : [ 76, 23 ] } } ], "departmentName" : "Gifts", "categoryName" : "Anniversary Gifts", "subCategoryName" : "Jewelry", "serviceFlag" : "", "updatedBy" : [ { "_id" : "M117442443", "name" : "Sales Team" } ], "createdBy" : [ { "_id" : "M117442443", "name" : "Sales Team" } ], "departmentId" : "5948c14be4b0d3372e47423d", "categoryId" : "5948cc1fe4b0d3372e474287", "catalogIsDeleted" : "false", "subCategoryId" : "5948cd46e4b0d3372e474291", "createdOn" : ISODate("2018-03-07T15:03:34.877+05:30"), "updatedOn" : ISODate("2018-03-08T13:09:53.373+05:30"), "availability" : [ { "startTime" : "null", "endTime" : "null" }, { "startTime" : "null", "endTime" : "null" }, { "startTime" : "null", "endTime" : "null" } ], "distance" : "0", "merchantStatus" : "Accepted" }

thank you

2
  • What is your mongo server version and spring mongo jar version ? Commented Mar 15, 2018 at 9:25
  • @Veeram mongo server version is 3.4.9 and spring data mongo is 1.8.4 Commented Mar 15, 2018 at 9:38

1 Answer 1

3

You can use AggregationOperation to build $redact aggregation stage.

You will need 1.8.5 version.

AggregationOperation redactOperation = aggregationOperationContext -> {
    Map<String, Object> map = new LinkedHashMap<>();
    BasicDBObject cmp =  new BasicDBObject("$cmp", Arrays.asList( "$items.address","$dist.location"));
    map.put("if", new BasicDBObject("$eq", Arrays.asList(cmp, 0)));
    map.put("then", "$$KEEP");
    map.put("else", "$$PRUNE");
    return new BasicDBObject("$redact", new BasicDBObject("$cond", map));
};

Aggregation agg = Aggregation.newAggregation(
    Aggregation.geoNear(nearQuery, "calculated"), 
    Aggregation.unwind("items"),
    redactOperation,
    Aggregation.skip(skip), 
    Aggregation.limit(limit)
);
Sign up to request clarification or add additional context in comments.

3 Comments

m using spring-boot-starter-data-mongodb , and by using above java code m not getting any o/p where as in mongo shell m getting proper output
Can I see your code ? Here is my generated query { "$redact" : { "$cond" : { "if" : { "$eq" : [{ "$cmp" : ["$items.address", "$dist.location"] }, 0] }, "then" : "$$KEEP", "else" : "$$PRUNE" } } } . compare with yours. Please make sure you are on 1.8.5 as well.
Did you include dist.location in the group stage ?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.