繁体   English   中英

检查Mongodb Java驱动程序中是否存在子字段

[英]Check for sub field existence in Mongodb java driver

我正在使用带有Java驱动程序的mongodb 3.4版。

我有以下格式的json集合:

{
    "foo": {
    "d4231ds": {
        "type":"A",
        "color":"red"
    },
    "dmncxa3s": {
        "type":"B",
        "color":"yellow"
    },

    "JsdjS8": {
        "type":"A",
        "color":"red"
    },

    "SKJDcxar3": {
        "type":"C",
        "color":"green"
    }
    },
    "bar": "100011"
}

我需要使用Java获取所有具有“ type”:“ A”的文档。 foo下的键(d4231ds,dmncxa3s等)是未知的,并且在文档之间有所不同。 因此,在这种情况下,不能使用点运算符。

我尝试了几种方法,但似乎无法实现。

您可以在最新的3.4服务器版本中尝试以下聚合。

使用$objectToArray将已命名的键转换为键值对( k, v ),并使用$in查询值文档的字段type = A

$redact对查询过滤器的结果$$KEEP进行匹配,否则匹配$$PRUNE

 MongoClient mongoClient = new MongoClient();
 MongoDatabase database = mongoClient.getDatabase(db_name);
 MongoCollection<Document> mongoCollection = database.getCollection(collection_name);
 Document query = Document.parse("{\"$redact\":{\"$cond\":[{\"$let\":{\"vars\":{\"subelems\":{\"$objectToArray\":\"$foo\"}},\"in\":{\"$in\":[\"A\",\"$$subelems.v.type\"]}}},\"$$KEEP\",\"$$PRUNE\"]}}");
 List<Document> result = mongoCollection.aggregate(Arrays.asList(query)).into(new ArrayList<>());

Mongo Shell查询:

db.collection_name.aggregate([
  {
    "$redact": {
      "$cond": [
        {
          "$let": {
            "vars": {
              "subelems": {
                "$objectToArray": "$foo"
              }
            },
            "in": {
              "$in": [
                "A",
                "$$subelems.v.type"
              ]
            }
          }
        },
        "$$KEEP",
        "$$PRUNE"
      ]
    }
  }
])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM