2013-03-26 83 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