2010-12-17 27 views
5

MongoDB için Pojo eşleştiricisi Morphia'yı kullanıyorum ve benim görüşüme göre çok basit olması gereken bir görevi zor buluyorum: kimliğine göre bir nesne almak. Bir koleksiyondaki tüm nesneleri bulabiliyorum ancak listeden aldığım bir kimliği kullanarak basit sorgulama görevini çözemiyorum. Aslında ObjectId'den bahsediyorum. JSON içinde oluşturmaya çalışırsam, bkz.Kimliği ile Sorgu Morphia

cevap

14

Bu soru eksik görünüyor.

Ayrıca, sorunun cevabı Morphia QuickStart page üzerindedir. Aşağıdaki gibi basit görünüyor. Bu yüzden kesinlikle daha fazla ayrıntıya ihtiyacınız olacak.

+5

varlığa "@id Nesne Kimliği id" eklemeyi asla unutmam. Hayatınızı kolaylaştırır. – caarlos0

7
Datastore ds = morphia.createDatastore("testDB"); 
String hotelId = "516d41150364a6a6697136c0"; // the ID of the hotel we want to load 
ObjectId objectId = new ObjectId(hotelId); 
// and then map it to our Hotel object 
Hotel hotel = ds.get(Hotel.class, objectId); 
+0

Kodunuzun neden çalıştığını veya neler yaptığını açıklayabilir misiniz? En iyi cevaplar, sadece işleyen koddan ziyade çözümü açıklar. – nathangiesbrecht

+0

@nathangiesbrecht Önceki [yanıt] 'da (http://stackoverflow.com/a/4475711/1094584) yanlıştır. MongoDB Kimliği, String tipi değil. MongoDB Id dosyasının Türü ObjectId'dir (org.bson.types.ObjectId). –

5

Eğer kimliğe göre buluyoruz ve kimliği kullanıcı tarafından sağlanıyorsa, yukarıda verilen çözümler kullanmamalısınız (o verinin ne tür olabileceği anlamına gelir).

olarak documentation açıklandığı, bir Nesne Kimliği 12 byte oluşur, bu nedenle new ObjectId(myValue) başka bir şey geçmesi halinde, kodunuzu bir IllegalArgumentException atar. İşte

Ben kimliğe göre bulmak için bir yöntem uygulamaya nasıl:

public Model findById(String id) throws NotFoundException { 
    if (!ObjectId.isValid(id)) { 
     throw new NotFoundException(); 
    } 

    ObjectId oid = new ObjectId(id); 
    Model m = datastore().find(Model.class).field("_id").equal(oid).get(); 
    if (m == null) { 
     throw new NotFoundException(); 
    } 
    return m; 
} 
+0

Kimlik geçerli bir ObjectId değilse, * bir NotFoundException değil, bir IllegalArgumentException atmalıdır. – metaforge