使用Java在MongoDB中查询数组元素的文档

我是MongoDB的新手。 我的样本文件是

{ "Notification" : [ { "date_from" : ISODate("2013-07-08T18:30:00Z"), "date_too" : ISODate("2013-07-30T18:30:00Z"), "description" : "fdfd", "url" : "www.adf.com" }, { "date_from" : ISODate("2013-07-01T18:30:00Z"), "date_too" : ISODate("2013-07-30T18:30:00Z"), "description" : "ddddddddddd", "url" : "www.pqr.com" } ], 

我正在尝试更新其"url" : "www.adf.com"的通知。 我的Java代码是:

 BasicDBObject query=new BasicDBObject("url","www.adf.com"); DBCursor f = con.coll.find(query); 

它不会搜索"url""www.adf.com"的文档。

在这种情况下,您有一个嵌套文档。 您的文档有一个字段Notification ,它是一个存储多个具有字段url子对象的数组。 要在子字段中搜索,您需要使用点语法:

 BasicDBObject query=new BasicDBObject("Notification.url","www.adf.com"); 

但是,这将使整个Notification数组返回整个文档。 您可能只想要子文档。 要对此进行过滤,您需要使用Collection.find的双参数版本 。

 BasicDBObject query=new BasicDBObject("Notification.url","www.example.com"); BasicDBObject fields=new BasicDBObject("Notification.$", 1); DBCursor f = con.coll.find(query, fields); 

.$表示“只有此数组的第一个条目与find-operator匹配”

这应该仍然返回一个带有子数组Notifications文档,但是这个数组应该只包含url == "www.example.com"的条目。

要使用Java遍历此文档,请执行以下操作:

 BasicDBList notifications = (BasicDBList) f.next().get("Notification"); BasicDBObject notification = (BasicDBObject) notifications.get(0); String url = notification.get("url"); 

顺便说一句:当您的数据库增长时,您可能会遇到性能问题,除非您创建索引来加速此查询:

 con.coll.ensureIndex(new BasicDBObject("Notification.url", 1));