2015-10-01 97 views
0

這裏是我的代碼如何使用MongoDB API Java在數組中找到文檔?

ServerAddress sa = new ServerAddress("localhost", 27017); 
MongoClient mongoClient = new MongoClient(sa); 
MongoDatabase db = mongoClient.getDatabase("waitinglist"); 
MongoCollection<Document> coll = db.getCollection("users"); 
MongoCursor<Document> f = coll.find(eq("users.email", "[email protected]")).iterator(); 
try { 
while (f.hasNext()) { 
    System.out.println("Mongo Cursor: " +f.next().toJson()); 
} 
} finally { 
    f.close(); 
} 

這裏是我收集的外觀:

{ 
"_id" : ObjectId("560b8b76a37991ab2d650ca9"), 
"users" : [ 
    { 
     "firstname" : "Marc", 
     "lastname" : "Berger", 
     "email" : "[email protected]", 
     "phone" : "12345" 
    }, 
    { 
     "firstname" : "Arnold", 
     "lastname" : "Schwarzenegger", 
     "email" : "[email protected]", 
     "phone" : "12345" 
    }] 
} 

我bassically想在電子郵件等於[email protected]用戶的文件,但它返回整個文檔與數組爲一體。我認爲問題是eq方法中的第一個參數,但我無法在google上找到解決方案。

+2

[只檢索MongoDB集合中的對象數組中的查詢元素]可能的副本(http://stackoverflow.com/questions/3985214/retrieve-only-the-queried-element-in-an-object-array -in-mongodb-collection)這是一個常見的問題,在這裏解釋了很多可能的解決方案。在你的情況下,基本的意思是在投影中使用位置'$'操作符。 –

+0

我認爲他們正在使用'BasicDBObject',如果您使用'.getDB()'方法,則會使用該方法,但不推薦使用此方法,因此我必須使用返回MongoDatabase的'.getDatabase()'。 – marcmaann

+0

位置'$'操作符與任何棄用的操作無關,因爲它是一個基本構造。在投影中,這告訴MongoDB只返回數組的第一個匹配元素。其他解決方案有多種聚合用途來返回「多個」匹配。查找在查詢中使用「投影」字段。這些解決方案擴展了所有的語言和驅動程序,因爲這只是MongoDB的基本方式。 –

回答

1

您在投影中使用positional $運算符以僅返回數組的匹配元素。這在.find()與MongoDB的3.x的java的驅動程序使用.projection()方法:

MongoCursor<Document> f = coll.find(eq("users.email", "[email protected]")) 
    .projection(new Document("users.$",1)).iterator(); 

然後,所有結果將只返回匹配的數組元素,而不是所有的數組元素。

相關問題