【问题标题】:Search in complex documents in mongo db在 mongodb 中搜索复杂的文档
【发布时间】:2017-01-30 12:58:36
【问题描述】:

假设我在 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 是否存在?

【问题讨论】:

    标签: java json mongodb mongodb-query


    【解决方案1】:

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

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

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

    以下查询可用于获取在ssid_shaper_list 数组中具有SSID2 对象的文档。

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

    【讨论】:

    • 感谢您的回复!但我必须将“ssid_domain”视为第三个搜索参数..
    • @user1053031:更新了答案。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      第二个键使用点符号指定嵌入文档,更多信息here

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

      【讨论】:

        猜你喜欢
        • 2017-07-11
        • 1970-01-01
        • 1970-01-01
        • 2016-08-18
        • 2021-06-03
        • 1970-01-01
        • 2011-05-24
        • 1970-01-01
        • 2012-07-01
        相关资源
        最近更新 更多