Сравнение, поиск и проекция данных MongoDB из Spring для выбора только нужного поля из искомого документа - PullRequest
0 голосов
/ 01 апреля 2019

У меня есть ниже две структуры документа. В структуре CRMContact.orgGroupId == OrganizationGroup.id. Я хотел бы получить весь документ CRMContact, который совпадает с sharedGroupIds, а также выбрать только несколько полей из CRMContact и только OrganizationGroup.groupownername из OrganizationGroup и сопоставить / заполнить groupId (только с одним полем [ имя_группы ] заполнено). Я использовал ниже пользовательскую реализацию, но не работал.

Я включил aggregarionsNotWorking, который не работает, и aggregarions, возвращающие всю заполненную группу организации. Как этого добиться, т. Е. Просто заполнить поле groupownername, используя spring data mongodb?

@Document(collection = "ww_crm_contact")
public class CRMContact{
    @Id
    protected String id;
    private String displayName;
    private String firstName;
    private String middleName;
    private String lastName;

    private OrganizationGroup groupId; //Ignore //Modified field name orgGroupId

    @Indexed(name = "CRMCONTACT_SHAREDGROUPID_IDX",background = true)
    private List<String> sharedGroupIds = new LinkedList<>();

    @Indexed(name = "CRMCONTACT_ORGGROUPID_IDX",background = true)
    private String orgGroupId;
}

@Document(collection = "ww_organization_groups")
public class OrganizationGroup {
    private static final long serialVersionUID = 600049975643062552L;
    @Id
    protected String id;

    private String groupName;
    private int riaId;
    private Boolean isPrivate;

    private String description;
    private Boolean deleted;
    @Transient
    private int count;

    private String groupownerid;
    private String groupownername;
}


@Repository
public class CustomCRMContactDAO {

    @Autowired
    MongoTemplate mongoTemplate;


    public List<CRMContact> getContactsPresentInGroup(List<ObjectId> objectIds){
        LookupOperation lookupOperation = LookupOperation.newLookup().from("ww_organization_groups").localField("orgGroupId").foreignField("_id").as("groupId");
        ProjectionOperation fields = project("firstName","lastName", "primaryId","displayName","groupId.groupownername");

        Aggregation aggregarionsNotWorking = Aggregation.newAggregation(Aggregation.match(Criteria.where("sharedGroupIds").in(objectIds)),lookupOperation,unwind("groupId"),fields); //Not Working even if I change the field only to groupownername

        Aggregation aggregarions = Aggregation.newAggregation(Aggregation.match(Criteria.where("sharedGroupIds").in(objectIds)),lookupOperation,fields); //


        List<CRMContact> crmContacts =  mongoTemplate.aggregate(aggregarions, "ww_crm_contact",CRMContact.class).getMappedResults();

        return crmContacts;

    }

}
...