2016-09-22 96 views
1

假設我有以下文件中蒙戈:搜索在複雜的文件在蒙戈DB

{ 
    "_id" : ObjectId("57e36c34eb2832aa68b39b26"), 
    "ap_domain" : "root", 
    "average_down" : 123, 
    "average_up" : 234, 
    "peak_down" : 123, 
    "peak_up" : 456, 
    "ssid_shaper_list" : 
    { 
     "SSID1" : { 
      "ssid_domain" : "root", 
       "peak_up" : 456, 
       "peak_down" : 456 
     }, 
     "SSID2" : { 
      "ssid_domain" : "root", 
       "average_up" : 567, 
       "average_down" : 567, 
       "peak_up" : 456, 
       "peak_down" : 456 
     } 
    } 
} 

我需要檢查SSID2存在於本文件。在這裏,我有3個鍵:

1. ap_domain = root 
2. ssid_shaper_list = SSID2 and in it: 
3. ssid_domain = root 

我應該如何撰寫我的搜索條件在java中使用BasicDBObject來檢查需要SSIDi存在?

回答

2

以下查詢包含您的所有搜索條件:

DBObject query = new BasicDBObject("ap_domain", "root").append("ssid_shaper_list.SSID2.ssid_domain", "root"); 

你並不需要檢查,如果在ssid_shaper_list存在作爲查詢的第二部分隱含這是否SSID2

以下查詢可用於獲取ssid_shaper_list陣列中具有SSID2對象的文檔。

DBObject query = new BasicDBObject("ssid_shaper_list.SSID2", new BasicDBObject("$exists", true)); 
+0

感謝您的回覆!但我必須考慮'ssid_domain'作爲第三個搜索參數。 – user1053031

+0

@ user1053031:更新了答案。 – 4J41

1

ssid_domain = root的匹配已經意味着存在SSID2。因此,您有:

Filters.and(
    Filters.eq("ap_domain", "root"), 
    Filters.eq("ssid_shaper_list.SSID2.ssid_domain", "root")); 

在MongoCollection.find()方法中使用該過濾器。

1

我認爲,可以通過組合2和3。簡化您的搜索條件,以便查詢看起來像:

{ap_domain: 'root', 'ssid_shaper_list.SSID2.ssid_domain': 'root'}

第二個關鍵的使用。號指定嵌入文檔,詳細信息here

根據您的mongo驅動程序版本,您可能需要使用QueryBuilder(之前的版本3.0),它將返回一個[基本] DBObject或Filters(3.0+),這將使您的Bson仍然可以以相同的方式用於查詢和看起來更乾淨