在mongo db中搜索复杂文档

时间:2016-09-22 05:12:48

标签: java json mongodb mongodb-query

假设我在Mongo中有以下文档:

{
    "_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

如何使用BasicDBObject在java中编写搜索条件以检查是否存在所需的SSIDi?

3 个答案:

答案 0 :(得分:2)

以下查询包含您的所有搜索条件:

SSID2

您无需检查ssid_shaper_list中是否存在SSID2,因为查询的第二部分会隐式执行此操作。

以下查询可用于获取ssid_shaper_list数组中包含DBObject query = new BasicDBObject("ssid_shaper_list.SSID2", new BasicDBObject("$exists", true)); 对象的文档。

  user = double(image: urlurl)
  allow(helper).to receive(:current_user).and_return(user)
  expect(helper.get_user_header).to eq("/uploads/user/1/logo.png")

答案 1 :(得分:1)

ssid_domain = root的匹配已经暗示SSID2存在。因此,你有:

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

在MongoCollection.find()方法中使用该过滤器。

答案 2 :(得分:1)

我认为您可以通过组合2.和3来简化搜索条件。因此您的查询将如下所示:

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

第二个键使用点表示法指定嵌入文档,更多信息here

根据您的mongo驱动程序版本,您可能需要使用QueryBuilder(3.0之前),这将返回[Basic] DBObject,或Filters(3.0+),它将为您提供仍然可以使用的Bson查询使用相同的方式,看起来更干净。