2013-03-26 5 views
0

관리자 ID가 "25160228446835585906563830293"이거나 사용자 ID가 "25160228446835585906563830293"인 모든 사용자 그룹 ID를 쿼리하고 싶습니다. Mongodb 쿼리 (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

+0

mongodb 또는 NoSql db가 완전히 새롭기 때문에 "string"의 중간에 색인을 생성 할 수 있습니까? 자바 obj에서, 나는 그것이 열쇠 인 것을 안다. 그러나 mongodb는 그것이 열쇠 인 것을 어떻게 안다? – Jaxox

답변

0

당신이 MongoDB의 자바 드라이버는 다음을 수행 할 수 있습니다 사용하는 경우

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을 쿼리하고 싶습니다. "관리자"{ "25,160228446835585906563830,293"ISODate ("2013-03-26T04 : 51 : 36.731Z") "25,160228446835585906563830,294"ISODate ("2013-03-26T04 : 51 : 36.731Z") "25160228446835585906563830295": ISODate ("2013-03-26T04 : 51 : 36.731Z") } – Jaxox

+0

다음과 같이 adminsID를 정의하고 위의 코드로 전달해야합니다. 다시 전체 데이터를 반환합니다. String adminsID = "25160228446835585906563830293" – anvarik

+0

감사합니다. 시도해 볼 것이므로 둘 대신 하나의 쿼리를 사용할 수 있습니까? 하나의 검색어로 관리자와 사용자에게 – Jaxox

1

나는 당신이 문서를 재구성하여 indexab로 만들 것을 제안합니다 더 쉽게 MongoDB에서 검색 할 수 있습니다.

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

이것은 검색이 더 자연스러운 것 :

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

사용할 수

대신에 필드로 adminid을 사용하는 배열의 대상으로 각 admin 추가 $in (docs) 연산자를 사용하여 id이 원하는 목록과 일치하는 admin을 찾으십시오 (admins.id).

그래서, 자바 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); 

당신은 인덱스 (docs)를 구축 할 ensureIndex를 사용할 수 있습니다.

{ 
    "_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