2016-09-22 71 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仍然可以以相同的方式用于查询和看起来更干净