spring data mongodb lookup with dbref -
i using mongodb (3.4) spring data. , getting incorrect results when use lookup operation. collection operation follows:
@document public class employee { @id string id; string name; @dbref empaddress address; string city; //redundant, intentionally //getters , setters } @document public class empaddress { @id string id; string city; //getters , setters } db populated following data
employees [{ "_id" : { "$oid" : "597b557cfe4b9104e8409f2a"} , "_class" : "com.example.employee" , "name" : "pkm1" , "city" : "nyc" , "address" : { "$ref" : "empaddress" , "$id" : { "$oid" : "597b557bfe4b9104e8409f25"}}}, { "_id" : { "$oid" : "597b557cfe4b9104e8409f2b"} , "_class" : "com.example.employee" , "name" : "pkm2" , "city" : "sfo" , "address" : { "$ref" : "empaddress" , "$id" : { "$oid" : "597b557bfe4b9104e8409f26"}}}, { "_id" : { "$oid" : "597b557cfe4b9104e8409f2c"} , "_class" : "com.example.employee" , "name" : "pkm3" , "city" : "la" , "address" : { "$ref" : "empaddress" , "$id" : { "$oid" : "597b557bfe4b9104e8409f27"}}}, { "_id" : { "$oid" : "597b557cfe4b9104e8409f2d"} , "_class" : "com.example.employee" , "name" : "pkm4" , "city" : "sfo" , "address" : { "$ref" : "empaddress" , "$id" : { "$oid" : "597b557bfe4b9104e8409f28"}}}, { "_id" : { "$oid" : "597b557cfe4b9104e8409f2e"} , "_class" : "com.example.employee" , "name" : "pkm5" , "city" : "nyc" , "address" : { "$ref" : "empaddress" , "$id" : { "$oid" : "597b557bfe4b9104e8409f29"}}}] cities [{ "_id" : { "$oid" : "597b557bfe4b9104e8409f25"} , "_class" : "com.example.empaddress" , "city" : "nyc"}, { "_id" : { "$oid" : "597b557bfe4b9104e8409f26"} , "_class" : "com.example.empaddress" , "city" : "sfo"}, { "_id" : { "$oid" : "597b557bfe4b9104e8409f27"} , "_class" : "com.example.empaddress" , "city" : "la"}, { "_id" : { "$oid" : "597b557bfe4b9104e8409f28"} , "_class" : "com.example.empaddress" , "city" : "sfo"}, { "_id" : { "$oid" : "597b557bfe4b9104e8409f29"} , "_class" : "com.example.empaddress" , "city" : "nyc"}] when lookup follows
matchoperation match = aggregation.match(criteria.where("name").is("pkm1")); lookupoperation lookup = lookupoperation.newlookup().from("empaddress").localfield("address.$id").foreignfield("id").as("emp_loc"); aggregation aggregation = aggregation.newaggregation(match, lookup); aggregationresults<dbobject> result = mongotemplate.aggregate(aggregation, "employee", dbobject.class); the results :
[{ "_id" : { "$oid" : "597b557cfe4b9104e8409f2a"} , "_class" : "com.example.employee" , "name" : "pkm1" , "city" : "nyc" , "address" : { "$ref" : "empaddress" , "$id" : { "$oid" : "597b557bfe4b9104e8409f25"}} , "emp_loc" : [ { "_id" : { "$oid" : "597b557bfe4b9104e8409f25"} , "_class" : "com.example.empaddress" , "city" : "nyc"} , { "_id" : { "$oid" : "597b557bfe4b9104e8409f26"} , "_class" : "com.example.empaddress" , "city" : "sfo"} , { "_id" : { "$oid" : "597b557bfe4b9104e8409f27"} , "_class" : "com.example.empaddress" , "city" : "la"} , { "_id" : { "$oid" : "597b557bfe4b9104e8409f28"} , "_class" : "com.example.empaddress" , "city" : "sfo"} , { "_id" : { "$oid" : "597b557bfe4b9104e8409f29"} , "_class" : "com.example.empaddress" , "city" : "nyc"}]}] the above result incorrect, since cities getting listed.
however, if lookup on field right result
lookupoperation lookup = lookupoperation.newlookup().from("empaddress").localfield("city").foreignfield("city").as("emp_loc"); the result follows :
[{ "_id" : { "$oid" : "597b557cfe4b9104e8409f2a"} , "_class" : "com.example.employee" , "name" : "pkm1" , "city" : "nyc" , "address" : { "$ref" : "empaddress" , "$id" : { "$oid" : "597b557bfe4b9104e8409f25"}} , "emp_loc" : [ { "_id" : { "$oid" : "597b557bfe4b9104e8409f25"} , "_class" : "com.example.empaddress" , "city" : "nyc"} , { "_id" : { "$oid" : "597b557bfe4b9104e8409f29"} , "_class" : "com.example.empaddress" , "city" : "nyc"}]}] how second result in when lookup using id?
it problem dbref. since mongodb 3.4, cannot use dbref in aggregation pipeline, except in $match stage.
the query returns results because id null, had same problem.
you should create manual references prevent problem.
you can read more in answer: https://stackoverflow.com/a/41677055/4023844
Comments
Post a Comment