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

检查Mongodb java驱动程序中是否存在子字段,java,mongodb,Java,Mongodb,我使用的是mongodb 3.4版,带有java驱动程序 我有一个这种格式的JSON集合: { "foo": { "d4231ds": { "type":"A", "color":"red" }, "dmncxa3s": { "type":"B", "color":"yellow" }, "JsdjS8": { "type":"A", "color":

我使用的是mongodb 3.4版,带有java驱动程序

我有一个这种格式的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获取所有类型为A的文档。foo d4231ds、dmncxa3s等项下的密钥事先不知道,并且文档之间存在差异。因此,在这种情况下,使用点运算符不起作用


我试过几种方法,但似乎都能做到这一点

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

使用$objectToArray将命名键转换为键值对k、v,并使用$in查询字段类型=A的值文档

$redact作用于查询筛选器的结果,$$KEEP when match else$$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<>());
db.collection_name.aggregate([
  {
    "$redact": {
      "$cond": [
        {
          "$let": {
            "vars": {
              "subelems": {
                "$objectToArray": "$foo"
              }
            },
            "in": {
              "$in": [
                "A",
                "$$subelems.v.type"
              ]
            }
          }
        },
        "$$KEEP",
        "$$PRUNE"
      ]
    }
  }
])