2013-03-26 44 views
0

我想要查询管理员ID =“25160228446835585906563830293”或用户ID =“25160228446835585906563830293”的所有UserGroup ID。Mongodb查询(散列表对象)

这是Java HashMap的键值对OBJ hashmap<String,Date> "25160228446835585906563830293" : ISODate("2013-03-26T04:51:36.731Z")

{ "_id" : ObjectId("51512958849ca4748271c640"), 
    "_class" : "com.pcd.app.model.UserGroup", 
    "groupName" : "sdfsadfsad", 
    "privacyType" : "PRIVACY_OPEN", 
    "approvalType" : "MEMBER_APPROVAL", 
    "groupDescription" : "test", 
    "admins" : { 
     "25160228446835585906563830293" : ISODate("2013-03-26T04:51:36.731Z"), 
     "25160228446835585906563830294" : ISODate("2013-03-26T04:51:36.731Z"), 
     "25160228446835585906563830295" : ISODate("2013-03-26T04:51:36.731Z") 
    }, 
    "users" : { 
     "25160228446835585906563830296" : ISODate("2013-03-26T04:51:36.731Z") 
    } 
} 
+0

好了,你尝试过什么? Fyi:如果密钥没有固定和索引,它需要扫描所有文档。 – WiredPrairie 2013-03-26 11:05:45

+0

我对mongodb或任何NoSQL数据库都是全新的,所以我可以索引“string”的中间值吗?在java obj中,我知道这是一个关键,但mongodb如何知道这是一个关键? – Jaxox 2013-03-26 16:35:12

回答

0

如果您正在使用MongoDB的Java驱动程序,你可以做到以下几点:

BasicDBObject queryForAdminsID = new BasicDBObject("admins." + adminsID, new BasicDBObject("$exists", true)); 
// BasicDBObject queryForUsersID = new BasicDBObject("users." + usersID, new BasicDBObject("$exists", true)); 
cursor = coll.find(query); // coll is a DBCollection 

try { 
while(cursor.hasNext()) { 
    System.out.println(cursor.next()); 
} 
} finally { 
cursor.close(); 
} 

其中usersIDadminsID是你的ID

+0

好的,但是我想要查询,25160228446835585906563830293从一列? “管理员”:{ “25160228446835585906563830293”:ISODate( “2013-03-26T04:51:36.731Z”), “25160228446835585906563830294”:ISODate( “2013-03-26T04:51:36.731Z”), “25160228446835585906563830295”:ISODate(“2013-03-26T04:51:36.731Z”) } – Jaxox 2013-03-26 16:36:54

+0

那么您应该定义adminsID并将其传递给上面的代码。它会将您的整个数据返回给您。字符串adminsID =“25160228446835585906563830293” – anvarik 2013-03-26 17:23:21

+0

好的谢谢,会尝试,所以可以使用一个查询而不是两个?为管理员和用户在一个查询? – Jaxox 2013-03-26 23:23:10

1

我建议你重组你的文件,使其indexabab在MongoDB中更容易搜索。

而不是使用adminid作为一个领域,加各admin作为数组的对象:

"admins" : [ 
     { id: "25160228446835585906563830293", 
      date: ISODate("2013-03-26T04:51:36.731Z") } 
    ], 

这将使搜索更自然:

db.so.find({ "admins.id" : 
    { $in: ['25160228446835585906563830293', 
      '25160228446835585906563830296']}}) 

您可以使用$indocs)运营商查找admin s与id匹配列表,如您所愿(admins.id)。

所以,对于一个Java的QueryBuilder,它可能是这个样子:

BasicDBList adminIds = new BasicDBList(); 
adminIds.addAll(ids); // the ids could be a List<String> 
DBObject inClause = new BasicDBObject("$in", adminIds); 
DBObject query = new BasicDBObject("admins.id", inClause); 

您可能需要使用ensureIndex来建立索引(docs)。

根据您的原来的例子,下面是引用完整的文档:

{ 
    "_id" : ObjectId("51512958849ca4748271c640"), 
    "_class" : "com.pcd.app.model.UserGroup", 
    "groupName" : "sdfsadfsad", 
    "privacyType" : "PRIVACY_OPEN", 
    "approvalType" : "MEMBER_APPROVAL", 
    "groupDescription" : "test", 
    "admins" : [ 
     { id: "25160228446835585906563830293" , 
      date: ISODate("2013-03-26T04:51:36.731Z") }, 
     { id: "25160228446835585906563830294" , 
      date: ISODate("2013-03-26T04:51:36.731Z") }, 
     { id: "25160228446835585906563830295" , 
      date: ISODate("2013-03-26T04:51:36.731Z") } 
    ], 
    "users" : [ 
     { id: "25160228446835585906563830296", 
      date : ISODate("2013-03-26T04:51:36.731Z") } 
    ] 
} 
+0

感谢您的帮助,我将不得不查看它如何为弹簧数据制作我自己的定制转换器。 – Jaxox 2013-03-26 22:37:34