簡體   English   中英

使用Java在MongoDB中查詢關於數組元素的文檔

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM