我正在使用SpringData Mongo来存储和从mongoDB中检索数据。
在我的网络应用程序中,我有一个管理员(超级用户),可以查看其子用户列表(直接代理),管理员由他的帐户表示,对于每个超级用户/管理员,有多个子用户(DA)。
我有低于JSON来表示我的数据:
{
"_id" : ObjectId("5a60bf4d52deb4984c5d87c8"),
"_class" : "com.abc.xyz.DirectAgentsMongoRecord",
"account" : NumberLong(1234),
"directAgentDetailsMongoRecords" : [
{
"daAccount" : NumberLong(987654),
"name" : "Anil",
"location" : "vfdgfds",
"mobileNo" : "09876543",
"commission" : "8",
"isActive" : true
},
{
"daAccount" : NumberLong(5432),
"name" : "Sudhir",
"location" : "frewrwe",
"mobileNo" : "233223",
"commission" : "11",
"isActive" : false
},
{
"daAccount" : NumberLong(5432),
"name" : "Bikas",
"location" : "frewrwe",
"mobileNo" : "233223",
"commission" : "10",
"isActive" : false
},
{
"daAccount" : NumberLong(5432),
"name" : "Pankaj",
"location" : "frewrwe",
"mobileNo" : "1234",
"commission" : "10",
"isActive" : false
}
]
}
Spring Data Mongo中的记录:
@Document(collection)
public class DirectAgentDetailsMongoRecord{
private Long daAccount;
private String name;
private String organisation;
private String location;
private String mobileNo;
private BigDecimal dues;
private BigDecimal creditLimit;
private BigDecimal commission;
private Boolean isActive;
//getter setter
}
@Document(collection = "BODirectAgents")
public class DirectAgentsMongoRecord{
@Id
private String id;
private Long account;
private List<DirectAgentDetailsMongoRecord> directAgentDetailsMongoRecords;
//getter and setters
}
我必须使用搜索条件帐户和子用户列表中的任何字段编写find方法,并且应该返回子用户列表(directAgentDetailsMongoRecords)。
我用以下方法编写了存储库:
@Query(value = "{ 'account' : ?0, 'directAgentDetailsMongoRecords.name' : ?1 }")
DirectAgentsMongoRecord findByAccountAndDirectAgentDetailsMongoRecordsName(Long account, String agentName);
但是上面的方法会返回超级用户,其中包含所有子用户记录。
我有两个问题:
在子用户阵列列表中,我必须执行过滤,排序操作,自动建议等,此外一个管理员永远不会需要另一个管理员的数据。目前,我正在为所有管理员/超级用户使用单一集合。为所有管理员设置单独的集合是否合适?目前,我们有2000多名管理员,该名单可能会增长。
在Single Collection中,如何对子元素执行操作(排序,搜索,获取单列数据)并仅返回子元素列表?示例方法:
DirectAgentDetailsMongoRecord [] findByAccountAndDirectAgentDetailsMongoRecordsName(Long account,String agentName);