MongoDb-如何使用java对集合中的多个字段进行排序和搜索
我正在尝试实现一个方法,在该方法中,我创建了一个哈希映射,其中key作为字符串,value作为对象。使用这个hashmap,我需要搜索和排序Mongo中存在的数据集合 下面是mongo db文件的id类:MongoDb-如何使用java对集合中的多个字段进行排序和搜索,java,mongodb,Java,Mongodb,我正在尝试实现一个方法,在该方法中,我创建了一个哈希映射,其中key作为字符串,value作为对象。使用这个hashmap,我需要搜索和排序Mongo中存在的数据集合 下面是mongo db文件的id类: public class Oid{ String $oid; public String get$oid() { return $oid; } public voi
public class Oid{
String $oid;
public String get$oid() {
return $oid;
}
public void set$oid(String $oid) {
this.$oid = $oid;
}
}
以下是pojo java文件:
public class AppUser {
private String password;
private String email;
private Date created_at;
private Date update_at;
Oid _id;
public AppUser() {
super();
// TODO Auto-generated constructor stub
}
public AppUser(String password, String email, Date created_at, Date update_at) {
super();
this.password = password;
this.email = email;
this.created_at = created_at;
this.update_at = update_at;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Date getCreated_at() {
return created_at;
}
public void setCreated_at(Date created_at) {
this.created_at = created_at;
}
public Date getUpdate_at() {
return update_at;
}
public void setUpdate_at(Date update_at) {
this.update_at = update_at;
}
public Oid get_id() {
return _id;
}
public void set_id(Oid _id) {
this._id = _id;
}
}
我使用gson转换这个pojo,并在获取它的get converted返回到java对象时
public class AppUserDao {
public List < AppUser > findMulitple(HashMap < String, Object > map) {
List < AppUser > appUsers = new ArrayList < > ();
MongoDatabase db = getDB();
BasicDBObject query = new BasicDBObject(map.keySet().iterator().next(), map.get(map.keySet().toArray()[0]));
int i = 0;
for (String key: map.keySet()) {
if (i != 0) {
query.append(key, map.get(key));
}
i++;
}
FindIterable < Document > filter = db.getCollection("sampleCollection").find(query);
MongoCursor < Document > cursor = filter.iterator();
try {
String obj = cursor.next().toJson();
System.out.println(obj);
AppUser appUser = gson.fromJson(obj, AppUser.class);
appUsers.add(appUser);
} catch (JsonSyntaxException jse) {
jse.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
cursor.close();
}
return appUsers;
}
}
公共类AppUserDao{
公共列表findMulitple(HashMapmap){
ListappUsers=newarraylist<>();
MongoDatabase db=getDB();
BasicDBObject query=newBasicDBObject(map.keySet().iterator().next(),map.get(map.keySet().toArray()[0]);
int i=0;
for(字符串键:map.keySet()){
如果(i!=0){
query.append(key,map.get(key));
}
i++;
}
FindTablefilter=db.getCollection(“sampleCollection”).find(查询);
MongoCursorcursor=filter.iterator();
试一试{
字符串obj=cursor.next().toJson();
系统输出打印项次(obj);
AppUser-AppUser=gson.fromJson(obj,AppUser.class);
appUsers.add(appUser);
}捕获(JsonSyntaxException jse){
printStackTrace();
}捕获(例外e){
e、 printStackTrace();
}最后{
cursor.close();
}
返回应用程序用户;
}
}
在其中,我发送了一个密钥及其属性的hashmap,用于过滤
以下是用于测试的单元测试类:
public class TestAppUser {
public static void main(String args[]) {
HashMap < String, Object > map = new HashMap < > ();
map.put("email", "berry.sanford@yahoo.com");
map.put("password", "Quo Lux");
AppUserDao appUserDao = new AppUserDao();
List < AppUser > appUsers = appUserDao.findMulitple(map);
for (AppUser appUser: appUsers) {
System.out.println(appUser.get_id().get$oid());
}
}
}
公共类TestAppUser{
公共静态void main(字符串参数[]){
HashMapmap=newhashmap<>();
地图。放(“电子邮件”,“浆果”。sanford@yahoo.com");
地图放置(“密码”、“勒克斯”);
AppUserDao AppUserDao=新的AppUserDao();
ListappUsers=appUserDao.findMulitple(map);
for(AppUser AppUser:appUsers){
System.out.println(appUser.get_id().get$oid());
}
}
}
在这个测试类中,我希望得到两个记录的列表。第一条记录将包含电子邮件值“berry”。sanford@yahoo.com“第二条记录的密码值为Quo Lux我将构建查询过滤器并按如下顺序排序
List<Bson> filters = map.entrySet().stream().map(entry->Filters.eq(entry.getKey(), entry.getValue())).collect(Collectors.toList());
List<Bson> sorts = map.keySet().stream().map(Sorts::ascending).collect(Collectors.toList());
FindIterable<Document> filter = db.getCollection("sampleCollection").find(Filters.and(filters)).sort(Sorts.orderBy(sorts));
MongoCursor<Document> cursor = filter.iterator();
List filters=map.entrySet().stream().map(entry->filters.eq(entry.getKey(),entry.getValue()).collect(Collectors.toList());
List sorts=map.keySet().stream().map(排序::升序).collect(Collectors.toList());
FindTerable filter=db.getCollection(“sampleCollection”).find(Filters.and(Filters)).sort(Sorts.orderBy(Sorts));
MongoCursor=filter.iterator();
哪个部件不工作?你能详细解释一下排序吗?在我的appuserdao中,搜索部分不起作用,我不知道如何实现排序部分。我的想法是发送一个hashmap,其中包含字段名作为键,值作为筛选值,它将返回集合中筛选数据的列表。更新了问题的更多细节。附加的db截图。我希望记录应该是带有类似条件的过滤器只是需要一个小的帮助我需要完全相同的代码,但我的java没有更新,所以可以用简单的for循环来帮助我。尝试直接传递mapBasicDbObject query=new BasicDbObject(map)你能输出query.toJson()
看看它在构建什么吗?是的$或
将它们放在一起。尝试类似于BasicDBList query=newbasicdblist();对于(Map.Entry-Entry:Map.entrySet()){query.add(new BasicDBObject(Entry.getKey(),Entry.getValue());}FindIterable filter=db.getCollection(“sampleCollection”).find(new BasicDBObject(“$or”,query))代码>