2013-03-26 4 views
0

Я хочу запросить идентификатор пользователя UserGroup, где ID админов = "25160228446835585906563830293" или идентификатор пользователя = "25160228446835585906563830293".Mongodb query (hashmap objects)

это ключ HashMap и пара значений в Java 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, поэтому могу ли я индексировать середину «строки»? в java obj, я знаю, что это ключ, но как монгодб знает, что это ключ? – Jaxox

ответ

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(); 
} 

где usersID и adminsID являются ваши идентификаторы

+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

+0

, тогда вы должны определить adminsID следующим образом и перейти к приведенному выше коду. Он вернет вам все данные назад. String adminsID = "25160228446835585906563830293" – anvarik

+0

Хорошо спасибо, попробуем это, так можно ли использовать один запрос вместо двух? для администраторов и пользователей в одном запросе? – Jaxox

1

Я предлагаю вам реструктурировать документ, чтобы сделать его indexab le и более легко найти в MongoDB.

Вместо использования id в admin как поле, добавьте каждый admin как объект массива:

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

Это сделает поиск более естественным:

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

Вы можете использовать $in (docs) Оператор ищет 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