[英]How to match a document with existing array elements in mongodb using java driver
[英]Query a document on array elements in MongoDB using Java
我是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));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.