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

Popular posts from this blog

javascript - Create a stacked percentage column -

Optimising Firebase database by automatically overwriting data -

javascript - Angular UI-Grid customTemplate directive causing rows to load slowly/? -